从 cron 运行 os.getlogin() 时参数无效

问题描述 投票:0回答:4

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

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上测试过了。

python gitpython
4个回答
43
投票

来自

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 提交错误(或者更好的是提交补丁)。


1
投票

这里是一个未经测试的关于可能有效的解决方法的猜测:

os.getlogin()
调用C库中的
getlogin()
,它反过来在与当前进程相对应的utmp记录中查找登录名。由于没有 cron 的 utmp 记录,您可以尝试使用以下命令创建一个记录:

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

在你的 crontab 中。也许你必须摆弄

sessreg

 选项。如果您尝试过,请告诉我这是否真的有效:)


0
投票
我在 python:3.7-alpine 的 docker 中运行的 python 程序也遇到了类似的问题。这是我看到的问题:

/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
    

0
投票
使用

getpass.getuser()
。可用性:Unix、Windows。

从环境或密码数据库中获取用户名。

首先尝试各种环境变量,然后是密码数据库。 只要设置了 USERNAME,这就可以在 Windows 上运行

来自Python的

os.login()
自己的文档:

返回控制终端登录的用户名 的过程。对于大多数目的,使用更有用

getpass.getuser()

因为后者检查环境变量
LOGNAME
USERNAME
 找出用户是谁,然后返回
pwd.getpwuid(os.getuid())[0]
 获取当前真实的登录名
用户 ID。

© www.soinside.com 2019 - 2024. All rights reserved.