在 python 脚本中执行 "qrsh"
Doing a "qrsh" inside python script
我想做一个 "qrsh",这是一个网格命令,returns 来自机器池的一个终端,它的行为与 "rsh" 非常相似,我正在尝试 运行 它来自 python 脚本并提出以下内容:
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
是错误的 - 它会 将 您的 Python 进程替换为 qrsh
过程。总体而言,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
呼叫。)
一个常见的初学者错误是期望 Python(或 OS 的其他未指定部分)从字符串中解析命令。 execl
和 subprocess
都要求您将命令拆分为字符串列表。在命令行中,您的 shell 会处理这个(因此 "qrsh -P test" 被解析为 ['qrsh', '-P', 'test']
,然后以这种形式传递给 execvp
)。
subprocess
模块允许您使用 shell=True
显式调用 shell 为此目的,但您最好忽略它,至少直到你对主题有了更好的理解;一旦你这样做了,你就不想了。
在 Unix 上,"argument 0" 的值很奇怪,您可能不需要担心。例如,登录 shell 被调用为 execvp("/bin/sh", "-sh", ...)
而非登录 shell 被调用为 execvp("/bin/sh", "sh", ....)
。大多数地方,参数零将与实际二进制文件的路径相同。
我想做一个 "qrsh",这是一个网格命令,returns 来自机器池的一个终端,它的行为与 "rsh" 非常相似,我正在尝试 运行 它来自 python 脚本并提出以下内容:
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
是错误的 - 它会 将 您的 Python 进程替换为 qrsh
过程。总体而言,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
呼叫。)
一个常见的初学者错误是期望 Python(或 OS 的其他未指定部分)从字符串中解析命令。 execl
和 subprocess
都要求您将命令拆分为字符串列表。在命令行中,您的 shell 会处理这个(因此 "qrsh -P test" 被解析为 ['qrsh', '-P', 'test']
,然后以这种形式传递给 execvp
)。
subprocess
模块允许您使用 shell=True
显式调用 shell 为此目的,但您最好忽略它,至少直到你对主题有了更好的理解;一旦你这样做了,你就不想了。
在 Unix 上,"argument 0" 的值很奇怪,您可能不需要担心。例如,登录 shell 被调用为 execvp("/bin/sh", "-sh", ...)
而非登录 shell 被调用为 execvp("/bin/sh", "sh", ....)
。大多数地方,参数零将与实际二进制文件的路径相同。