我有一个测试脚本,例如“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
中的错误,还是我做错了什么?
答案 0 :(得分:3)
在Linux上,
#!/usr/bin/env TEST=anything python
将TEST=anything python
作为一个参数传递给env
。
所以env
不会正确处理论证。
最重要的是你只能在{b}线上env
之后放一个命令,其他一切最多都会被忽略。
另一个可移植性问题是命令的解释 参数。一些系统,包括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'