Подтвердить что ты не робот

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

Если я создаю файл, например:

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.

4b9b3361

Ответ 1

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

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

import os, pwd

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

import git

# do whatever you need to do with GitPython here

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

Ответ 2

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

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

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