[英]Executing shell command from python
我正在嘗試編譯一組行並執行它們並將輸出附加到文本文件。 我沒有寫同樣的東西,而是使用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腳本中指定"&"
后,程序也不在后台運行。
我在這里犯了什么明顯的錯誤?
提前致謝
您可以通過使用帶有參數shell=True
Popen()
來調用子進程,就好像您在shell中一樣:
subprocess.Popen("nohup ./op.o > myout.txt &", shell=True)
這個問題是當你提供參數作為元素列表時,子進程庫繞過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.