12

Windows で pythonw.exe を使用して次のスクリプトを実行したときに、stdout と stderr の内容を取得できるようにしたいと考えています。

import subprocess
import sys
import os
import string
import time

tmpdir = 'c:/temp'
cmd = 'dir c:'

tmpfile = "tmp_%f" % (time.time())
tmpfile = os.path.normpath(os.path.join(tmpdir,tmpfile))
tmpfile2 = tmpfile+".bat"
tmpfile3 = tmpfile+".txt"

fa = open(tmpfile2,'w')
fa.write("@ECHO OFF > NUL\n")
fa.write('call '+cmd+"\n")
fa.close()

wcmd = []
wcmd.append(tmpfile2)

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW

fb = open(tmpfile3,'w')
fb.write("\n")
fb.write(tmpfile2+"\n")

try:
    procval = subprocess.Popen(wcmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
    fb.write(str(procval)+"\n")
    fb.write("Sucess")
    fb.close()
except:
    fb.write(str(procval)+"\n")
    fb.write("Failure")
    fb.close()

python.exe を使用して実行すると、期待される出力が得られます。pythonw.exe を使用して実行すると、例外側になります。コマンドと startupinfo フラグだけで popen を実行すると、コマンドは正常に完了しますが、子プロセスのデータにはアクセスできません。私が読んだものはすべて、これは機能するはずですが、何かが欠けているに違いないと述べています。どんな助けでも大歓迎です。

ありがとう、ランディ

4

2 に答える 2

11

pythonw.exeを使用している場合、これはおそらくバグです

pythonw.exeは、標準のファイル記述子への通常のアクセス権を持たないデーモンプロセスを開始します。スクリプトで行う必要があるのは、stdinの3番目のfdを具体的に設定することだけです。

p = subprocess.Popen(wcmd,
                     startupinfo=startupinfo,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT,
                     stdin=subprocess.PIPE)
procval = p.communicate()
于 2012-04-26T17:51:45.900 に答える
4

(この回答で数年遅れています...)私は同じ問題に遭遇し、これを置き換える必要があることがわかりました:

stdout=subprocess.PIPE

これとともに:

stdin=subprocess.PIPE

根本的な問題についての私の推測は次のとおりです。pythonw は stdin なしでプロセスを起動します (コンソールがないため、理にかなっています)。サブプロセスが stdin にアクセスしようとすると、エラーが発生します。

別の方法として、stdin に /dev/null を使用する方法があります。その方法については、このスレッドを参照してください: subprocess.Popen からの出力を無視します(stdin で devnull を使用する場合を除く)。

于 2015-03-10T23:43:24.640 に答える