1

実行可能ファイルを実行し、subprocess.Popen;を使用してその出力をキャプチャしようとしています。ただし、すべての出力を取得しているわけではないようです。

import subprocess as s
from subprocess import Popen 
import os

ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE)
print 'pOpen done..'

while:

line = ps.stdout.readline()
print line

手動で開くと、元のexeファイルより2行少なく印刷されます。

同じ結果で別のアプローチを試しました:

f = open('myprogram_output.txt','w')
proc = Popen('C:\Tools\Dvb_pid_3_0.exe ', stdout =f)

line = proc.stdout.readline()
print line
f.close()

誰かがexeファイルの完全なデータを取得するのを手伝ってもらえますか?

セバスチャンによって尋ねられたように:

元のexeファイルの最後の数行o/p:

-Gdd:一般的なカウント(1〜1000)

-Cdd:カット開始(0-99)-Edd:カット終了(1-100)

以下からストリームファイル番号を選択してください。

1-。\pdsx100-bcm7230-squashfs-sdk0.0.0.38-0.2.6.0-prod.sao.ts

実行後に取得するo/p:

-P0xYYYY      : Pid been interested                                          

-S0xYYYY:サービスIDに関心があります
-T0xYYYY:トランスポートIDに関心があります
-N0xYYYY:ネットワークIDに関心があります
-R0xYYYY:古いPidがこのPIDに置き換えられました
-Gdd:一般的なカウント(1〜1000)

したがって、いくつかの行が欠落していることがわかります。以下に表示されるファイル番号を選択してから、1を書き込んで値を選択する必要があります。

ps.stdin.write( '1 \ n')を使おうとしました。exeファイルの値を出力しませんでした

新しいコード:

#!/usr/bin/env python
from subprocess import Popen, PIPE

cmd = r'C:\Tools\Dvb_pid_3_0.exe'
p = Popen(cmd, stdin=PIPE, stdout=None, stderr=None, universal_newlines=True)
stdout_text, stderr_text = p.communicate(input="1\n\n")

print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text))
if p.returncode != 0:
    raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode))

Sebastienに感謝します。出力全体を見ることができますが、現在のコードで入力をフィードすることはできません。

4

2 に答える 2

16

すべての stdout を文字列として取得するには:

from subprocess import check_output as qx

cmd = r'C:\Tools\Dvb_pid_3_0.exe'
output = qx(cmd)

stdout と stderr の両方を 1 つの文字列として取得するには:

from subprocess import STDOUT

output = qx(cmd, stderr=STDOUT)

すべての行をリストとして取得するには:

lines = output.splitlines()

サブプロセスによって印刷されている行を取得するには、次のようにします。

from subprocess import Popen, PIPE

p = Popen(cmd, stdout=PIPE, bufsize=1)
for line in iter(p.stdout.readline, ''):
    print line,
p.stdout.close()
if p.wait() != 0:
   raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode))

stdout/stderr をマージする呼び出しに追加stderr=STDOUTします。Popen()

注:cmd非インタラクティブ モードでブロック バッファリングを使用する場合、行はバッファがフラッシュされるまで表示されません。winpexpectモジュールは、より早く出力を取得できる可能性があります。

出力をファイルに保存するには:

import subprocess

with open('output.txt', 'wb') as f:
    subprocess.check_call(cmd, stdout=f)

# to read line by line
with open('output.txt') as f:
    for line in f:
        print line,

cmd空のものでも常に入力が必要な場合。セットstdin:

import os

with open(os.devnull, 'rb') as DEVNULL:
    output = qx(cmd, stdin=DEVNULL) # use subprocess.DEVNULL on Python 3.3+

これらのソリューションを組み合わせて、たとえば stdout/stderr をマージし、出力をファイルに保存し、空の入力を提供することができます。

import os
from subprocess import STDOUT, check_call as x

with open(os.devnull, 'rb') as DEVNULL, open('output.txt', 'wb') as f:
    x(cmd, stdin=DEVNULL, stdout=f, stderr=STDOUT)

.communicate()すべての入力を単一の文字列として提供するには、次のメソッドを使用できます。

#!/usr/bin/env python
from subprocess import Popen, PIPE

cmd = ["python", "test.py"]
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
stdout_text, stderr_text = p.communicate(input="1\n\n")

print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text))
if p.returncode != 0:
    raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode))

ここでtest.py:

print raw_input('abc')[::-1]
raw_input('press enter to exit')

プログラムとのやり取りが会話に似ている場合は、winpexpectmoduleが必要になる場合があります。docs例を次に示しpexpectます。

# This connects to the openbsd ftp site and
# downloads the recursive directory listing.
from winpexpect import winspawn as spawn

child = spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')

などの特別なキーを送信するにF3は、 Windows ではモジュールまたはその純粋な Python 実装F10が必要になる場合があります。何かのようなもの:SendKeysSendKeys-ctypes

from SendKeys import SendKeys

SendKeys(r"""
    {LWIN}
    {PAUSE .25}
    r
    C:\Tools\Dvb_pid_3_0.exe{ENTER}
    {PAUSE 1}
    1{ENTER}
    {PAUSE 1}
    2{ENTER}
    {PAUSE 1}
    {F3}
    {PAUSE 1}
    {F10}
""")

出力をキャプチャしません。

于 2012-09-26T16:31:40.230 に答える
2

Pythonはそれにこだわっているので、あなたの質問のインデントは私を少し遠ざけました。あなたはそのように何かを試しましたか:

import subprocess as s
from subprocess import Popen 
import os

ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE)
print 'pOpen done..'

(stdout, stderr) = ps.communicate()
print stdout

stdoutこれは、コマンドから返されるものの1つの文字列になると思います。したがって、readline()出力を1行ずつ表示することを前提としているため、これは希望どおりではない可能性があります。

あなたが今していることに一致するいくつかの使用法については、 http: //docs.python.org/library/subprocess.htmlをざっと見てみることをお勧めします。

于 2012-09-26T12:05:29.630 に答える