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。代わりに、出力を追加しており、Pythonスクリプトで指定した後でもnohup.out、プログラムはバックグラウンドで実行されていません。"&"

ここで犯した明らかなエラーは何ですか?

前もって感謝します

4

2 に答える 2

5

Popen()引数を使用して、シェルにいるかのようにサブプロセスを呼び出すことができますshell=True

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

この問題は、要素のリストとして引数を指定すると、サブプロセス ライブラリがシェルをバイパスし、exec syscall を使用してプログラムを直接実行することです (この場合は「nohup」)。したがって、">" および "&" 演算子は、出力をリダイレクトしてバックグラウンドで実行するためにシェルによって解釈されるのではなく、リテラル引数として nohup コマンドに渡されます。

サブプロセスにシェル経由でコマンドを実行するように指示できますが、これによりシェルの余分なインスタンス全体が開始され、無駄になる可能性があります。回避策として、シェル プリミティブを使用する代わりに、サブプロセスで組み込みのリダイレクト機能を使用します。

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 に答える