OSError:[Errno 22] Python PHP问题

时间:2011-03-16 06:11:35

标签: php python exec last.fm

我之前问了一个类似的问题,但我终于进一步解决了这个问题,但现在我被卡住了。

我在dreamhost上的web服务器上运行python。我使用putty进入shell并运行我的python脚本,它运行良好。但是当我使用exec从php运行它时,它会崩溃。

在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 个答案:

答案 0 :(得分:0)

This previous answer about Errno 22 when using os.getlogin应具有启发性:

  

来自os.getlogin() docs:“返回登录到流程控制终端的用户。”从cron运行时,您的脚本没有控制终端。文档接着建议:“对于大多数用途,使用环境变量LOGNAME查找用户是谁更有用,或者pwd.getpwuid(os.getuid())[0]获取当前有效用户的登录名称更有用ID“。

您在PHP中通过passthru()调用脚本。 PHP将作为Web服务器用户运行 - 经常nobodyapache - 和cron一样,该用户也不会控制终端。

虽然您可能能够修补代码,但通过使用您发现的内容向python-lastfm项目提交错误,您可能会获得更好的服务。不幸的是,我不知道足够的Python来帮助完成这项任务,也不太了解为什么python-lastfm应用程序想要获得当前用户。 看起来就像只是在寻找一个临时的文件路径,并试图对它有所了解。

补丁的替代方法可能是为脚本设置环境变量,但对于passthru没有明显的方法。也许您可以在调用passthru之前尝试使用putenv('USER=myname'),其中'myname'是您的shell登录名。