OSError: [Errno 22] Проблема с Python PHP - PullRequest
1 голос
/ 16 марта 2011

Ранее я задавал подобный вопрос, но, наконец, решил его дальше, но теперь я застрял.

Я запускаю python на веб-сервере на хосте сновидений.Я включаю его с помощью putty и запускаю скрипт на python, и он отлично работает.Но когда я запускаю его из php с помощью exec, он падает.

Используя функцию passthru () в php, я получаю сообщение об ошибке:

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 голосов
/ 16 марта 2011

Этот предыдущий ответ об Errno 22 при использовании os.getlogin должен быть поучительным:

Из os.getlogin() документов : «Возвращает пользователя, вошедшего в систему на управляющем терминале процесса». Ваш скрипт не имеет управляющего терминала при запуске из cron. Далее в документах предлагается: «Для большинства целей более полезно использовать переменную окружения LOGNAME, чтобы узнать, кто пользователь, или pwd.getpwuid(os.getuid())[0], чтобы получить имя для входа в систему для действующего в настоящее время идентификатора пользователя».

Вы вызываете скрипт через passthru() в PHP. PHP будет работать как пользователь веб-сервера - часто nobody или apache - и, подобно cron, этот пользователь также не будет управлять терминалом.

Хотя вы можете исправлять код, вам, вероятно, будет лучше, если вы отправите сообщение об ошибке в проекте python-lastfm с тем, что вы обнаружили. К сожалению, я не знаю достаточно Python, чтобы помочь с этой задачей, а также недостаточно знаю, почему приложение python-lastfm хочет получить текущего пользователя. Он выглядит как будто он просто ищет временный путь к файлу и пытается быть умным с этим.

Альтернативой исправлению может быть установка переменных среды для скрипта, но для passthru очевидного способа сделать это не существует. Возможно, вы можете попробовать использовать putenv('USER=myname') перед вызовом passthru, где 'myname' - это ваше имя для входа в оболочку.

...