2010-12-09 28 views
18

如果我像創建一個文件:Python的os.getlogin問題

import os 
print os.getlogin() 

,並用cron運行它,我得到一個異常

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

如果我在外殼手動運行 - 它的工作原理。

問題是,commit()中的GitPython 0.3.1使用了這個函數,我需要使用它。

有什麼解決方法嗎?

我已經在Ubuntu10.10/python2.6.6和Debian5.0.6/python2.5.2上測試過它。

回答

34

來自os.getlogin()docs:「返回登錄到進程控制終端的用戶。」從cron運行時,您的腳本沒有控制終端。該文檔繼續建議:「對於大多數用途,使用環境變量LOGNAME找出用戶是誰更有用,或者pwd.getpwuid(os.getuid())[0]獲取當前有效用戶ID的登錄名。」

既然你不想修改GitPython,你可以寫一個腳本,做這樣的:

import os, pwd 

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

import git 

# do whatever you need to do with GitPython here 

我建議提交一個錯誤(或更好,但提交補丁)與GitPython,雖然。

+0

是的,問題是關於解決方法)手動編輯外國包是我想要做的最後一件事) – gistart 2010-12-09 15:08:13

0

這是一個未經測試的猜測,可能適用於解決方法:os.getlogin()在C庫中調用getlogin(),它依次在與當前進程相對應的utmp記錄中查找登錄名。由於是沒有的cron的utmp記錄,你可以嘗試在你的crontab使用

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

創建一個。也許你必須與sessreg選項混在一起。並讓我知道如果這真的工作,如果你嘗試它:)