1

そのスクリプトによって生成された出力がsys.stdoutで利用できるように、bashスクリプトで記述された外部プログラムを呼び出して、pythonを介してファイルに出力を記録できるようにするにはどうすればよいですか。

例えば。私は今、次のスニペットを通してそれらを呼び出します

if os.name == 'nt':
    path = module_dir_run+'/run.bat'
else:
    path = module_dir_run+'/run.sh'
if os.path.isfile(path):
    if (splitargs.arg):
        try:
            call([path, splitargs.arg])
        except:
            pass
    else:
        try:
            call([path])
        except:
            pass
else:
    print "Not found : " + path

値を保存するsys.stdout = file(filename, "w")と、Pythonが出力するものはすべて保存されますが、スクリプトが出力するものは保存されません。

注: 実行しようとしているスクリプトは対話型スクリプトであるため、呼び出しが終了し、制御が python に戻った後、端末に書かれている内容をすべて取得するにはどうすればよいですか? 助言がありますか?

4

4 に答える 4

2

Python スクリプト内から別のプログラムを実行するには、常に subprocess.Popen() を使用します。例:

import subprocess

print "Starting process..."
process = subprocess.Popen(["echo", "a"], shell=False)
process.wait()
print "Done"

次のように、プロセスの出力を別のファイルにリダイレクトできます。

import subprocess

print "Starting process..."
with open("./out.log", "w") as f:
    process = subprocess.Popen(["echo", "a"], shell=False, stdout=f)
    process.wait()
print "Done"

「stderr」パラメーターを使用して、stderr をリダイレクトすることもできます。

現在のスクリプトをリダイレクトして独自のファイルに書き込む場合sys.stdout、これを実行してサブプロセスでもリダイレクトできます。

import subprocess
import sys

sys.stdout = open("./out.log", "w")
print "Starting process..."
sys.stdout.flush()
process = subprocess.Popen(["echo", "a"], shell=False, stdout=sys.stdout)
process.wait()
print "Done"
于 2013-01-10T10:02:50.443 に答える
1

次の例を使用して、そのような呼び出しの出力を変数に書き込むことができます。

variable = subprocess.Popen(
    ['ls', 'mydir/'],  # note that the command is split on whitespace
    stdout=subprocess.PIPE).communicate()[0]
于 2013-01-10T10:00:58.420 に答える
0

これは使えるかもしれません。特に、他の回答のほとんどは、呼び出しているプログラム/スクリプトが「インタラクティブ」であるため、親シェルの stdin を子プロセスの stdin にリダイレクトする必要があることを理解していないためです。

Python とサブプロセスの入力パイピング

于 2013-01-10T13:23:25.603 に答える
0

Martijn Pieters が既に述べているようstdoutに、call()通話の代替手段を提供する必要があります。

基本的に 2 つの方法があります: * すでに開いているファイルを提供するsys.stdout( . ( then 経由ではなく、 によって返されたオブジェクト経由です。)stdout=subprocess.PIPEstdoutsubprocess.call()subprocess.Popen()

sys.stdout変更しても、OS の観点からプロセスの stdout が実際に変更されるわけではありませんが、通常とは異なるファイル記述子にすべてを出力するようにプログラムに命令することに注意してください。

于 2013-01-10T09:59:34.907 に答える