我之前问了一个类似的问题,但我终于进一步解决了这个问题,但现在我被卡住了。
我在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'
缩进不在此纠正。
答案 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服务器用户运行 - 经常nobody
或apache
- 和cron一样,该用户也不会控制终端。
虽然您可能能够修补代码,但通过使用您发现的内容向python-lastfm项目提交错误,您可能会获得更好的服务。不幸的是,我不知道足够的Python来帮助完成这项任务,也不太了解为什么python-lastfm应用程序想要获得当前用户。 看起来就像只是在寻找一个临时的文件路径,并试图对它有所了解。
补丁的替代方法可能是为脚本设置环境变量,但对于passthru
没有明显的方法。也许您可以在调用passthru
之前尝试使用putenv('USER=myname')
,其中'myname'是您的shell登录名。