用Python执行Shell命令

3
我正在尝试编写一组代码行并执行它们,然后将输出附加到文本文件中。为了避免重复操作,我使用了一个Python脚本在后台进行编译和执行。
import subprocess
subprocess.call(["ifort","-openmp","mod1.f90","mod2.f90","pgm.f90","-o","op.o"])
subprocess.call(["nohup","./op.o",">","myout.txt","&"])

使用ifort编译器编译程序pgm.f90时,输出没有附加到myout.txt中。相反,它将输出附加到nohup.out中,并且即使在Python脚本中指定了"&",该程序也没有在后台运行。

我犯了什么明显的错误?

谢谢!

2个回答

5

您可以使用Popen()函数和参数shell=True来像在shell中一样调用子进程:

subprocess.Popen("nohup ./op.o > myout.txt &", shell=True)

4
这个问题出在当你将参数作为元素列表提供时,子进程库会绕过 shell 并使用 exec 系统调用直接运行你的程序(在这种情况下是 "nohup")。因此,">" 和 "&" 操作符不再由 shell 解释以重定向输出并在后台运行,而是被作为字面参数传递给 nohup 命令。
你可以告诉 subprocess 通过 shell 执行你的命令,但这会启动一个额外的 shell 实例,可能会浪费资源。为了解决这个问题,可以使用 subprocess 中内置的重定向功能,而不是使用 shell 原语:
p = subprocess.Popen(['nohup', "./op.o"],
                     stdout=open('myout.txt', 'w'))
# process is now running in the background.
# if you want to wait for it to finish, use:
p.wait()
# or investigate p.poll() if you want to check to see if
# your process is still running.

更多信息请参考:http://docs.python.org/2/library/subprocess.html


我该如何解决这个问题? - Vaidyanathan

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