我正在研究用 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+。