5

subprocess.Popenにあるものをすべて読みましたが、何かが足りないと思います。

Pythonスクリプトで作成されたリストからデータストリームを読み取り、そのプログラムの結果をファイルに書き込むUNIXプログラムを実行できる必要があります。bashプロンプトから、私はこれを常に問題なく実行していますが、この段階に入る前に、いくつかのバイナリファイルと大量のデータを前処理するPythonスクリプト内からこれを実行しようとしています。

すべての前処理を含まない簡単な例を見てみましょう。

import sys
from pylab import *
from subprocess import *
from shlex import split

# some arbitrary x,y points
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)]

commandline = 'my_unix_prog option1 option2 .... > outfile'
command = split(commandline)

process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
print process.communicate(str(points))

これがbashで実行される方法は次のとおりです。

echo "11 31
      13 33
      15 37
      16 35
      17 38
      18 39.55" | my_unix_prog option1 option2 .... > outfile

データがUNIXプログラムに供給される方法も重要です。空白で区切られた2列でフォーマットする必要があります。

どんな助けでもありがたいです...

4

3 に答える 3

4

解決しました!

Dharaxhainingxの助けを借りて、私はこれを理解することができました:

import sys
from pylab import *
from subprocess import *
from shlex import split

# some arbitrary x,y points
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)]

commandline = 'my_unix_prog option1 option2 ....'
command = split(commandline)

process = Popen(command, stdin=PIPE, stdout=open('outfile', 'w'), stderr=PIPE)
for p in points:
    process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n')

print process.communicate()

おかげで、これは非常にうまく機能します。

于 2012-08-06T15:18:59.997 に答える
1

のようなものはどうですか

for p in points:
    process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n')

print process.communicate()
于 2012-08-06T14:13:53.860 に答える
0

正しく通信するには、入力をフォーマットする必要があります。

strタプルのリストを印刷するときに、必要なものではない特殊文字を保持します。

>>> print str([(1,2), (3,4)]) 
[(1,2), (3,4)]

これを試して:

print process.communicate("\n".join(["%s %s"%(x[0], x[1]) for x in points])
于 2012-08-06T14:16:08.963 に答える