1

非常に小さなスクリプトを作成し、スクリプトの出力をキャプチャしようとしました。同様の方法で何度も書いていますが、問題はありませんでした。入力してもらえますか。私は非常にばかげた間違いをしていると思います

numpy_temp = """
import numpy
import sys
a, b, c = numpy.polyfit(%s,%s, 2)
print a, b, c""" %(x, y)
fp_numpy = open("numpy_temp.py", "w")
fp_numpy.write(numpy_temp)
cmd = "/remote/Python-2.7.2/bin/python numpy_temp.py "
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE,
            stderr = subprocess.PIPE, shell = True)
out, err = proc.communicate()
print "out", out
4

4 に答える 4

2

を実際に閉じることはないfp_numpyため、実行しようとした時点でスクリプトが空または不完全である可能性があります。

空であるとは限りませが、空である可能性は非常に高いです。7 つの異なるバージョンの Python を搭載した 2 つの異なる *nix コンピューターでこれを試すと、毎回空になります… (スクリプトが終了した後、ファイルが閉じられてフラッシュされるという事実により、問題のデバッグが難しくなります。)

これを修正する最善の方法は、withステートメントを使用することです。そのため、ファイルを閉じるのを忘れることはありません。

with open("numpy_temp.py", "w") as fp_numpy:
    fp_numpy.write(numpy_temp)

しかし、それ以上に、別の問題があります。生成されたスクリプトで例外が発生した場合、stdout には何も出力されず、トレースバックが stderr にダンプされます。これを読んで無視します。xエラーを無視していると、問題をデバッグするのが非常に難しくなります... 何にandを渡しているのかわかりませんyが、たとえば、numpy.array1 に評価される文字列の代わりに a を渡している場合、簡単に取得できます例外であり、決して表示されません。stderr を stdout に送信するかprint "err", err、最後に送信します。

そして最後に、コマンド文字列とここでコマンド文字列を使用するべきではありませshell=Trueん。正当な理由もなく余分なレベルの間接化が発生し、デバッグが難しくなる可能性があるためです。これを行うだけです:

cmd = ["/remote/Python-2.7.2/bin/python", "numpy_temp.py"]
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE)
于 2013-10-17T18:15:29.653 に答える
0

スクリプトの出力をキャプチャするスクリプトを作成する理由がわかりません (おそらく、正当な理由があるのでしょう)。この種のタスクは、シェルを使用するとはるかに簡単です。

を作成し、numpy_temp.pyその出力をファイルにパイプします。

/remote/Python-2.7.2/bin/python numpy_temp.py > output.txt

データを既存のファイルに追加するには

/remote/Python-2.7.2/bin/python numpy_temp.py >> output.txt
于 2013-10-17T18:15:16.467 に答える
0

使用しprint outませんprint "out"

于 2013-10-17T18:09:54.450 に答える