os.getenv 返回 None 而非正确的值。

14

我有一个复杂的软件,无法发布,也没有具体的工作示例。我会尽力解释问题,希望有人遇到过这个问题。

在Linux shell中,我定义了一个环境变量:

> export MY_TEST_ENV=4711
> echo $MY_TEST_ENV
> 4711

我想从复杂的代码中获取这个变量:

print os.getenv('MY_TEST_ENV')

该函数总是返回None。如果我创建一个测试脚本来测试这个行为,即使在不同文件中的类中,我总是得到期望的行为,例如os.getenv('MY_TEST_ENV')返回正确的值4711

代码是用sudo启动的。

有什么想法是原因吗?


1
你是如何运行这个“复杂代码”的? - Wooble
4
其他的环境变量还在吗?Python进程是如何启动的?如果您使用execve系统调用启动一个进程,并且没有填充环境变量,那么子进程的环境变量会被清零。 - alexis
我知道解决我的问题是微不足道的 - 因为我以sudo身份运行python进程!但在被问及如何运行代码之前,我没有看到这个解决方案。如果没有sudo,我可以看到变量(但是代码的其余部分将无法工作)。 - Alex
@Alex 请记住,sudo 命令会以超级用户权限启动一个新的 shell,并根据安全策略清除环境变量。使用 -E(或 --preserve-env)选项可能会导致 MY_TEST_ENV 变量被保留,也可能不会,这取决于您系统安全策略的具体情况。另一种方法是请求拥有适当访问权限的人通过编辑适当的初始化脚本将您想要注入到 root 环境中的变量注入到系统中。 - Greg Bacon
1个回答

12

很可能是您调用Python进程的方式导致您失去了环境变量。如果您在运行的shell中导出变量,并在同一Shell中直接调用相关的Python进程,则该环境变量应该对该Python进程可用。为了帮助您调试此问题:不要使用相关的代码(print os.getenv('my...')),而是通过print os.environ打印整个环境。从结果中,您应该能够推断出发生了什么事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接