2016-08-17 18 views
0

我想做一個「qrsh」,它是一個從機器池返回終端的網格命令,它的行爲與「rsh」非常相似,我試圖從它運行在一個python腳本里面,並提出以下內容:在python腳本中做「qrsh」

os.execl("/remote/sge1/default/bin/lx-amd64/qrsh", "-P test") 

是否有可能實現這一目標?我的期望輸出是這樣的:

./script.py 
(does qrsh and returns terminal) machine> 

回答

1

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的一些其他未說明的一部分)從字符串解析命令。 execlsubprocess都要求您將命令拆分爲字符串列表。在命令行中,你的shell會處理這個問題(所以「qrsh -P test」被解析爲['qrsh', '-P', 'test'],然後以這種形式傳遞給execvp)。

subprocess模塊允許您使用shell=True明確調用用於此目的的殼,但你最好還是忽略了,至少要等到你有一個更好的瞭解的話題;一旦你做了,你就不會想要。

在Unix上,「參數0」的值是一個好奇心,你可能不需要擔心。例如,登錄shell被調用爲execvp("/bin/sh", "-sh", ...),而非登錄shell被調用爲execvp("/bin/sh", "sh", ....)。大多數地方,參數零將與實際二進制文件的路徑相同。

+0

太好了,謝謝。我想我錯過了正確的參數分裂。 – Arovit