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

时间:2012-04-18 20:10:22

标签: python shell env

我有一个测试脚本,例如“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中的错误,还是我做错了什么?

3 个答案:

答案 0 :(得分:3)

在Linux上,

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

TEST=anything python作为一个参数传递给env。 所以env不会正确处理论证。

最重要的是你只能在{b}线上env之后放一个命令,其他一切最多都会被忽略。

来自Wikipedia entry on Shebang

  

另一个可移植性问题是命令的解释   参数。一些系统,包括Linux,do not split up the arguments[24];例如,使用第一个脚本运行脚本时   像线一样,

     

#!/ usr / bin / env python -c

     

也就是说,python -c将作为一个参数传递给/ usr / bin / env,   而不是两个论点。 Cygwin也表现得这样。

答案 1 :(得分:1)

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

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

import os

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

答案 2 :(得分:0)

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

然后在Linux上,你可能需要使用一个小的存根python脚本或bash脚本或其他东西来重新发明VERSIONER_PYTHON_PREFER_32_BIT,这些都是如下所示:

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