从python执行shell命令

时间:2013-08-22 20:54:32

标签: python append subprocess

我正在尝试编译一组行并执行它们并将输出附加到文本文件。我没有写同样的东西,而是使用python脚本在后台编译和执行。

import subprocess
subprocess.call(["ifort","-openmp","mod1.f90","mod2.f90","pgm.f90","-o","op.o"])
subprocess.call(["nohup","./op.o",">","myout.txt","&"])

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

我在这里犯了什么明显的错误?

提前致谢

2 个答案:

答案 0 :(得分:5)

您可以使用带有参数Popen()的{​​{1}}来调用子进程,就好像您在shell中一样:

shell=True

答案 1 :(得分:4)

这个问题是,当您提供参数作为元素列表时,子进程库会绕过shell并使用exec系统调用来直接运行您的程序(在您的情况下,“nohup”)。因此,而不是“>”和“&” shell解释运算符以重定向输出并在后台运行,它们作为文字参数传递给nohup命令。

你可以告诉子进程通过shell执行你的命令,但这会启动一个额外的shell实例并且可能会浪费。要解决此问题,请使用子进程中的内置重定向功能,而不是使用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