OSError: [Errno 22] Python PHP 问题

1 投票
1 回答
1906 浏览
提问于 2025-04-16 13:48

我之前问过一个类似的问题,但现在我在解决它的过程中又遇到了新的困难。

我在DreamHost的网络服务器上运行Python。我用Putty连接到服务器,运行我的Python脚本,一切都很顺利。但是,当我通过PHP使用exec命令来运行它时,程序就崩溃了。

我在PHP中使用passthru()函数时,得到了这个错误:

Traceback (most recent call last): File "newwork.py", line 20, 
in api=lastfm.Api(api_key) File "lastfm/api.py", line 22, 
in __init__ File "lastfm/filecache.py", line 19, 
in __init__ File "lastfm/filecache.py", line 76, 
in _InitializeRootDirectory File "lastfm/filecache.py", line 70, 
in _GetTmpCachePath File "lastfm/filecache.py", line 66, 
in _GetUsername OSError: [Errno 22] Invalid argument 

我完全不知道这是什么意思,也不知道该从哪里入手。为了提供更多信息,我使用的Python lastfm模块可以在这里找到:http://code.google.com/p/python-lastfm/

而我的Python脚本简单来说就是这样:

import sys
import lastfm
import MySQLdb

sys.stderr=sys.stdout
value="testuser"
api_key='---my api key is here'
api=lastfm.Api(api_key)
user=api.getUser(value)
top_artists=user.topArtists

任何帮助都会非常感谢,或者任何想法都可以。我甚至不知道该从哪里开始。

编辑:我做了一些额外的工作,发现最后一行的完整内容是:

line 66, in _GetUsername os.getlogin() or \ OSError: [Errno 22] Invalid argument 

而GetUsername函数简单来说就是这样:

def _GetUsername(self):
'''Attempt to find the username in a cross-platform fashion.'''
return os.getenv('USER') or \
os.getenv('LOGNAME') or \
os.getenv('USERNAME') or \
os.getlogin() or \
'nobody'

这里的缩进已经纠正过了。

1 个回答

1

之前关于使用 os.getlogin 时出现 Errno 22 的回答可以让你更明白这个问题:

根据 os.getlogin()文档: “返回登录到进程控制终端的用户。” 当你的脚本通过 cron 运行时,它没有控制终端。文档还建议:“对于大多数情况,使用环境变量 LOGNAME 来找出用户是谁,或者使用 pwd.getpwuid(os.getuid())[0] 来获取当前有效用户 ID 的登录名,会更有用。”

你是通过 PHP 的 passthru() 来调用这个脚本的。PHP 作为网页服务器用户运行——通常是 nobodyapache——而这个用户和 cron 一样,也没有控制终端。

虽然你可以尝试修补代码,但可能更好的办法是把你发现的问题反馈给 python-lastfm 项目。可惜我对 Python 了解不够,无法帮你处理这个问题,也不太清楚为什么 python-lastfm 应用需要获取当前用户。看起来它只是想找一个临时文件路径,并试图聪明地处理这个问题。

修补的一个替代方案可能是为脚本设置环境变量,但对于 passthru 来说,似乎没有明显的方法可以做到这一点。也许你可以在调用 passthru 之前尝试使用 putenv('USER=myname'),其中 'myname' 是你的 shell 登录名。

撰写回答