2

Python のサブプロセスを介してコマンドを実行しようとしていますが、正しく実行されません。シェルに入力すると:

pack < packfile.dat

どこpackに私のソフトウェアがありpackfile、が入力ファイルである場合、ソフトウェアは正常に動作します。

Pythonでこれを試してみると:

import subprocess as sp
import shlex

cmd = 'pack < packfile.dat'.split()
p = sp.Popen(cmd)

ソフトウェアは不平を言います:

Pack must be run with: pack < inputfile.inp 

Reading input file... (Control-C aborts)

そしてそれはそこにぶら下がっています。

この最後の部分は私のソフトウェアに固有のものですが、実際には、同じコマンドを実行する 2 つの方法では異なる結果が得られますが、そうであってはなりません。

誰が私が間違っているのか教えてもらえますか?

実際、私は最終的に次のことを行うつもりです。

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE)
stdout, stderr = p.communicate()

私はこれに少し慣れていないので、これがベストプラクティスでない場合はお知らせください。

前もって感謝します。

4

3 に答える 3

5

I/O リダイレクションはシェルの製品であり、デフォルトでは Popen はそれを使用しません。これを試して:

p = sp.Popen(cmd, shell=True)

subprocess.Popen() IO リダイレクト

そこから、シェルオプションを好まない人もいることがわかります。その場合、おそらく次の方法で実現できます。

with open('input.txt', 'r') as input:
    p = subprocess.Popen('./server.py', stdin=input)
于 2012-09-27T15:17:52.280 に答える
1

「<」はコマンドのパラメーターではないため、パラメーターとして渡すべきではありません。

試す:

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE, stdin=open('packfile.dat'))
于 2012-09-27T15:18:46.337 に答える
1

これを試して:

import subprocess as sp
p = sp.Popen(['pack'], stdin = open('packfile.dat', 'r'))
于 2012-09-27T15:18:48.007 に答える