我想做一个" qrsh"这是一个从机器池返回一个终端的网格命令,它的行为非常类似于" rsh",我试图从python脚本中运行它并提出以下内容:
os.execl("/remote/sge1/default/bin/lx-amd64/qrsh", "-P test")
有可能实现这一目标吗?我对输出的期望是这样的:
./script.py
(does qrsh and returns terminal) machine>
答案 0 :(得分: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!
(我假设您/remote/sge1/default/bin/lx-amd64
已经PATH
;如果不是,则需要提供qrsh
的明确路径,就像execl
一样打电话。)
一个常见的初学者错误是期望Python(或操作系统的其他一些未指定的部分)从字符串中解析命令。 execl
和subprocess
都要求您将命令拆分为字符串列表。在命令行中,你的shell会处理这个问题(所以“qrsh -P test”被解析为['qrsh', '-P', 'test']
,然后以这种形式传递给execvp
。
subprocess
模块允许您使用shell=True
为此目的显式调用shell,但最好忽略它,至少在您更好地理解它之前话题;一旦你这样做,你就不会想要。
在Unix上,“参数0”的值是一个你可能不需要担心的好奇心。例如,登录shell被调用为execvp("/bin/sh", "-sh", ...)
,而非登录shell被调用为execvp("/bin/sh", "sh", ....)
。大多数地方,参数零将与实际二进制的路径相同。