22

如果我创建一个文件,如:

import os
print os.getlogin()

并用cron运行它,我得到一个例外

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

如果我在 shell 中手动运行它——它可以工作。

问题是,commit() 中的 GitPython 0.3.1 使用了这个函数,我需要使用它。

有什么解决方法吗?

我已经在 Ubuntu10.10/python2.6.6 和 Debian5.0.6/python2.5.2 上测试过了。

4

2 回答 2

40

来自os.getlogin() 文档:“将登录的用户返回到进程的控制终端。” 您的脚本在运行时没有控制终端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 提交错误(或者更好的是提交补丁)。

于 2010-12-09T15:04:23.563 回答
1

这是一个未经测试的猜测,可能是一种解决方法: os.getlogin()调用getlogin()C 库,然后在与当前进程相对应的 utmp 记录中查找登录名。由于 cron 没有 utmp 记录,您可以尝试使用

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

在你的 crontab 中。也许你不得不摆弄这些sessreg选项。如果您尝试过,请告诉我这是否真的有效:)

于 2010-12-09T15:19:27.647 回答