我正在使用Python編寫的包裝器腳本。包裝應該根據系統狀態選擇另一個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
停止在re-exec上冗長); - Python解釋器被不必要地重新執行(使用PyPy它會在我的系統上添加0.7s);
- 它依賴於
sys.executable
是有用的,和文檔說:如果Python是無法檢索到它的可執行文件真實路徑,
sys.executable
將是一個空字符串或None
。
os.execl
電話解決所有問題。到目前爲止,我可以告訴:
execfile()
可能會工作,但它是在Python3取出並用手AFAICS重新實現它是醜陋的(因爲編碼問題)。我不確定execfile()
有什麼其他含義;imp.load_module()
可能會工作,但它是一個有點哈克和Python3.3已被否決。它可能也會遭受Python3編碼問題。
哪種解決方案,你建議我用?
編輯:我會忘記。該解決方案必須使用Python 2.5+,PyPy和Jython 2.5+。
你能'import'新的腳本? – martineau
這看起來不錯,但你可以做一些驗證第一,Exec之前,也檢查sys.flags重建標誌。 – Keith
我碰上其中'sys.executable'路徑包含空格,需要被引用到正常工作的情況。 – martineau