Python os.getlogin проблема - PullRequest
       18

Python os.getlogin проблема

18 голосов
/ 09 декабря 2010

Если я создаю файл вроде:

import os
print os.getlogin()

и запустить его с помощью cron, я получаю исключение

print os.getlogin()
OSError: [Errno 22] Invalid argument

Если я запускаю его вручную в оболочке - он работает.

Проблема в том, что GitPython 0.3.1 в commit () использует эту функцию, и мне нужно ее использовать.

Есть ли обходной путь?

Я тестировал его на Ubuntu10.10 / python2.6.6 и Debian5.0.6 / python2.5.2.

Ответы [ 2 ]

36 голосов
/ 09 декабря 2010

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

Так как вы не хотите изменять GitPython, вы можете написать скрипт, который делает это:

import os, pwd

os.getlogin = lambda: pwd.getpwuid(os.getuid())[0]

import git

# do whatever you need to do with GitPython here

Я бы посоветовал сообщить об ошибке (или, что еще лучше, отправить исправление) в GitPythonВпрочем.

1 голос
/ 09 декабря 2010

Вот непроверенное предположение о возможном обходном пути: os.getlogin() вызывает getlogin() в библиотеке C, которая, в свою очередь, ищет имя пользователя в записи utmp, соответствующей текущему процессу. Поскольку для cron нет записи utmp, вы можете попробовать создать ее, используя

sessreg -a <logname> ; do_stuff ; sessreg -d <logname>

в вашем crontab. Может быть, вам придется вертеться с опциями sessreg. И дайте мне знать, если это действительно сработало, если вы попробовали это:)

...