Python在Linux上的os.system和subprocess区别

7
我有两个Python脚本。第一个脚本调用第二个脚本的表格,在其中我需要执行第三方Python脚本。它看起来像这样:
# the call from the first script. 
cmd = "qsub -sync y -b -cwd -V -q long  -t 1-10 -tc 5 -N 'script_two' ./script2.py"

script2thread = pexpect.spawn(cmd)

# end of script 1 

所以在这里我将10个任务发送到队列中。在脚本2中,我有一个基于task_id的case语句。在每个任务中,我使用不同的参数调用第三方脚本。

...
elif(task_id == 4)
subprocess.call(./script3)

# or 

os.system(./script3 , shell=True)

这就是我的问题所在。使用其中之一有什么区别/好处吗?我知道在Windows上使用一个比另一个更好,因为有支持问题,但我在Linux上,并不打算在Windows上运行此代码。有时,使用子进程会得到非常奇怪的结果,它找不到网络中的其他内容,而当第三个脚本独立地运行时,它可以找到这些内容。

可能是在Python中调用外部命令的重复问题。 - Nabin
1个回答

16
你应该使用 subprocess 模块。虽然这并没有什么区别,但它是一个新的模块,旨在替换 os.system (请查看此部分以获取一种可直接替换的方法)。此外,如果你将来需要更多功能,它也具有更多特性。
简而言之:除了兼容较旧版本的 Python,没有理由使用 os.system

2
如果您不需要新功能:是否需要使用subprocess?(os.system的优点是语法更简单) - Martin Thoma
@MartinThoma 不,我认为没有这样的方法。文档提到 os.system 的返回值是与操作系统相关的,因此错误处理可能会变得不太可靠。顺便说一下,我不明白 os.system("mycmd" + " myarg")subprocess.call("mycmd" + " myarg", shell=True) 更容易的原因。 - kirelagin
在使用os.system时,无论命令有多长,你都可以将其作为单个字符串传递,而不需要像子进程一样将所有参数拆分成列表。 - Martin Thoma
@MartinThoma 噢,是的,你说得对!但是如果你也传递 shell=True 的话就不一样了。 - kirelagin
所以@MartinThoma提到的避免传递列表 - 转换为:subprocess.Popen("mycmd" + " myarg", shell=True) - Agile Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接