2016-08-17 117 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