3

我正在尝试编译一组行并执行它们并将输出附加到文本文件中。我没有编写相同的东西,而是使用 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. 相反,它会将输出附加到nohup.out并且即使在指定之后程序也没有在后台运行"&"相反,即使在 python 脚本中

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

提前致谢

4

2 回答 2

5

Popen()您可以通过使用参数调用子进程,就好像您在 shell 中一样shell=True

subprocess.Popen("nohup ./op.o > myout.txt &", shell=True)
于 2013-08-22T20:57:40.370 回答
4

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

你可以告诉 subprocess 通过 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

于 2013-08-22T20:58:44.087 回答