如果我创建一个如下文件:
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上测试过了。
来自
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 提交错误(或者更好的是提交补丁)。
这里是一个未经测试的关于可能有效的解决方法的猜测:
os.getlogin()
调用C库中的getlogin()
,它反过来在与当前进程相对应的utmp记录中查找登录名。由于没有 cron 的 utmp 记录,您可以尝试使用以下命令创建一个记录:
sessreg -a <logname> ; do_stuff ; sessreg -d <logname>
在你的 crontab 中。也许你必须摆弄
sessreg
选项。如果您尝试过,请告诉我这是否真的有效:)
/app/bin # ./util.py
Traceback (most recent call last):
File "./util.py", line 58, in <module>
__auth__ = '/tmp/util-' + os.getlogin() + '.auth'
OSError: unable to determine login name
我能够通过导出 LOGNAME 来规避这个问题。
docker run -e LOGNAME -it --entrypoint /bin/sh b7c35f...cef2738
getpass.getuser()
。可用性:Unix、Windows。
从环境或密码数据库中获取用户名。来自Python的首先尝试各种环境变量,然后是密码数据库。 只要设置了 USERNAME,这就可以在 Windows 上运行
os.login()
自己的文档:
返回控制终端登录的用户名 的过程。对于大多数目的,使用更有用
getpass.getuser()
因为后者检查环境变量LOGNAME
或USERNAME
找出用户是谁,然后返回pwd.getpwuid(os.getuid())[0]
获取当前真实的登录名 用户 ID。