繁体   English   中英

为什么使用env设置初始环境会阻止我的Python脚本在Ubuntu上的启动?

[英]why does setting an initial environment using env stall the launch of my Python script on Ubuntu?

我有一个测试脚本,例如“ test.py”,我想制作一个脚本,以便它在脚本开始之前以特定的环境变量集执行:

#!/usr/bin/env TEST=anything python

print "Hello, world."

运行此程序通常可以按预期工作:

$ python test.py 
Hello, world.

但是,如果我将其作为程序运行:

$ chmod +x test.py
$ ./test.py 

该字符串从不打印,而是执行停滞,“ top”报告一个名为“ test.py”的进程,该进程使用100%CPU。

这仅发生在我的Ubuntu计算机上,在OS X上似乎很好。

原因是最终我想通过设置以下命令使特定脚本始终在32位Python中运行:

#!/usr/bin/env VERSIONER_PYTHON_PREFER_32_BIT=yes python

在文件的顶部。 但是,如果这意味着脚本将不会在Linux计算机上执行,那么这是不行的。 我发现不管指定的环境变量是什么,都有类似的效果。 但是,如果没有设置环境变量:

#!/usr/bin/env python

print "Hello, world."

该脚本可以正常运行:

$ ./test.py 
Hello, world.

这是Python还是env的错误,还是我做错了什么?

在Linux上,

#!/usr/bin/env TEST=anything python

TEST=anything python作为参数传递给env 因此env将无法正确处理该参数。

最重要的是,您只能在enbang之后的env后面放置一个命令,其他所有内容最多将被忽略。

Shebang上Wikipedia条目中

另一个可移植性问题是命令参数的解释。 某些系统,包括Linux, 没有将参数分开[24] 例如,使用第一行运行脚本时,

#!/ usr / bin / env python -c

也就是说,python -c将作为一个参数传递给/ usr / bin / env,而不是两个参数。 Cygwin也有这种行为。

我怀疑/usr/bin/env VERSIONER_PYTHON_PREFER_32_BIT=yes python是否可以正常运行。

相反,请尝试使用Python设置环境变量:

import os

os.environ['VERSIONER_PYTHON_PREFER_32_BIT'] = 'yes'

至少在Linux上,您可能需要忘记VERSIONER_PYTHON_PREFER_32_BIT。 在Mac上,您可以使用外壳包装。

然后在Linux上,您可能需要使用较小的stub python脚本或bash脚本或类似内容重新发明VERSIONER_PYTHON_PREFER_32_BIT,如下所示:

>>> import platform
>>> platform.machine()
'x86_64'
>>> platform.processor()
'x86_64'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM