我想做一个“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