OSError: [Errno 22] Python PHP 问题
我之前问过一个类似的问题,但现在我在解决它的过程中又遇到了新的困难。
我在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 个回答
之前关于使用 os.getlogin
时出现 Errno 22 的回答可以让你更明白这个问题:
根据
os.getlogin()
的 文档: “返回登录到进程控制终端的用户。” 当你的脚本通过 cron 运行时,它没有控制终端。文档还建议:“对于大多数情况,使用环境变量LOGNAME
来找出用户是谁,或者使用pwd.getpwuid(os.getuid())[0]
来获取当前有效用户 ID 的登录名,会更有用。”
你是通过 PHP 的 passthru()
来调用这个脚本的。PHP 作为网页服务器用户运行——通常是 nobody
或 apache
——而这个用户和 cron 一样,也没有控制终端。
虽然你可以尝试修补代码,但可能更好的办法是把你发现的问题反馈给 python-lastfm 项目。可惜我对 Python 了解不够,无法帮你处理这个问题,也不太清楚为什么 python-lastfm 应用需要获取当前用户。看起来它只是想找一个临时文件路径,并试图聪明地处理这个问题。
修补的一个替代方案可能是为脚本设置环境变量,但对于 passthru
来说,似乎没有明显的方法可以做到这一点。也许你可以在调用 passthru
之前尝试使用 putenv('USER=myname')
,其中 'myname' 是你的 shell 登录名。