从python执行shell命令
我试图编译一组行并执行它们,然后将输出附加到文本文件中。我没有编写同样的东西,而是使用python脚本在后台编译和执行从python执行shell命令,python,append,subprocess,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","&"]) 正在使用ifort编译器编译程序pgm.f90,但输出
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脚本中指定了“&”
,程序也不会在后台运行
我在这里犯了什么明显的错误
提前感谢您可以使用
Popen()
和参数shell=True
调用子流程,就像在shell中一样:
subprocess.Popen("nohup ./op.o > myout.txt &", shell=True)
这个问题是,当您以元素列表的形式提供参数时,子流程库会绕过shell并使用exec syscall直接运行您的程序(在您的例子中是“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.
有关更多信息:我将如何处理此问题?