我正在研究用 Python 编写的包装器脚本。包装器应该根据系统状态选择另一个 Python 脚本并执行它(使用绝对路径)。无需返回父脚本。
应该注意的是,我无法控制正在运行的脚本。他们可以使用__name__
检查、访问sys.argv
,并且所有的行为都应该像直接运行脚本一样。
现在,我正在使用os.execl()
:
import os, sys
# ...
os.execl(sys.executable, sys.executable, new_script, *sys.argv[1:])
但我至少可以算出三个问题:
- 传递给 Python 解释器的任何选项都不会保留(例如
python -v wrapper
,在重新执行时不再冗长); - Python 解释器被不必要地重新执行(使用 PyPy 它在我的系统上增加了 0,7s);
- 它依赖于
sys.executable
有用,文档说:如果 Python 无法检索到其可执行文件的真实路径,
sys.executable
它将是一个空字符串或None
.
os.execl
来解决所有问题。到目前为止,我可以说:
execfile()
可能会工作,但它在 Python3 中被删除并手动重新实现它 AFAICS 是丑陋的(因为编码问题)。我不确定还有什么其他影响execfile()
;imp.load_module()
可能会工作,但它有点hacky并且在Python3.3中被弃用了。它也可能会遇到 Python3 编码问题。
您建议我使用哪种解决方案?
编辑:我会忘记的。该解决方案必须适用于 Python 2.5+、PyPy 和 Jython 2.5+。