2

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

4

3 回答 3

3

在 Linux 上,

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

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

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

来自关于 Shebang 的 Wikipedia 条目

另一个可移植性问题是命令参数的解释。包括 Linux 在内的一些系统不会拆分参数 [24];例如,当使用第一行运行脚本时,

#!/usr/bin/env python -c

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

于 2012-04-18T20:18:20.567 回答
1

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

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

import os

os.environ['VERSIONER_PYTHON_PREFER_32_BIT'] = 'yes'
于 2012-04-18T20:19:11.697 回答
0

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

然后在 Linux 上,您可能需要使用一个小的存根 python 脚本或 bash 脚本或其他东西重新发明 VERSIONER_PYTHON_PREFER_32_BIT,取决于以下内容:

>>> import platform
>>> platform.machine()
'x86_64'
>>> platform.processor()
'x86_64'
于 2012-04-18T21:53:04.687 回答