我想做一個「qrsh」,它是一個從機器池返回終端的網格命令,它的行爲與「rsh」非常相似,我試圖從它運行在一個python腳本里面,並提出以下內容:在python腳本中做「qrsh」
os.execl("/remote/sge1/default/bin/lx-amd64/qrsh", "-P test")
是否有可能實現這一目標?我的期望輸出是這樣的:
./script.py
(does qrsh and returns terminal) machine>
我想做一個「qrsh」,它是一個從機器池返回終端的網格命令,它的行爲與「rsh」非常相似,我試圖從它運行在一個python腳本里面,並提出以下內容:在python腳本中做「qrsh」
os.execl("/remote/sge1/default/bin/lx-amd64/qrsh", "-P test")
是否有可能實現這一目標?我的期望輸出是這樣的:
./script.py
(does qrsh and returns terminal) machine>
os.execl
的語法有點棘手。您顯然是在尋找
os.execl("/remote/sge1/default/bin/lx-amd64/qrsh", "qrsh", "-P", "test")
但是,如果你想真正留住子的控制下,execl
是錯誤的 - 它會與qrsh
過程中更換你的Python程序。總體而言,subprocess.call
既易於使用,又多用途。 (事實上,除非你正在實現一個替代subprocess.call
你或許應該從低層次望而卻步os.exec*
元。)
subprocess.call(['qrsh', '-P', 'test'])
# Look, your Python program is still executing after qrsh finishes!
(我假設你在PATH
已經/remote/sge1/default/bin/lx-amd64
;如果你不這樣做,你需要在你execl
調用提供給qrsh
明確的路徑一樣。)
一個常見的初學者的錯誤是認爲Python(或OS的一些其他未說明的一部分)從字符串解析命令。 execl
和subprocess
都要求您將命令拆分爲字符串列表。在命令行中,你的shell會處理這個問題(所以「qrsh -P test」被解析爲['qrsh', '-P', 'test']
,然後以這種形式傳遞給execvp
)。
的subprocess
模塊允許您使用shell=True
明確調用用於此目的的殼,但你最好還是忽略了,至少要等到你有一個更好的瞭解的話題;一旦你做了,你就不會想要。
在Unix上,「參數0」的值是一個好奇心,你可能不需要擔心。例如,登錄shell被調用爲execvp("/bin/sh", "-sh", ...)
,而非登錄shell被調用爲execvp("/bin/sh", "sh", ....)
。大多數地方,參數零將與實際二進制文件的路徑相同。
太好了,謝謝。我想我錯過了正確的參數分裂。 – Arovit