做一个" qrsh"在python脚本中

时间:2016-08-17 02:12:31

标签: python subprocess

我想做一个" qrsh"这是一个从机器池返回一个终端的网格命令,它的行为非常类似于" rsh",我试图从python脚本中运行它并提出以下内容:

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

有可能实现这一目标吗?我对输出的期望是这样的:

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

1 个答案:

答案 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(或操作系统的其他一些未指定的部分)从字符串中解析命令。 execlsubprocess都要求您将命令拆分为字符串列表。在命令行中,你的shell会处理这个问题(所以“qrsh -P test”被解析为['qrsh', '-P', 'test'],然后以这种形式传递给execvp

subprocess模块允许您使用shell=True为此目的显式调用shell,但最好忽略它,至少在您更好地理解它之前话题;一旦你这样做,你就不会想要。

在Unix上,“参数0”的值是一个你可能不需要担心的好奇心。例如,登录shell被调用为execvp("/bin/sh", "-sh", ...),而非登录shell被调用为execvp("/bin/sh", "sh", ....)。大多数地方,参数零将与实际二进制的路径相同。