Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子进程Popen不使用pythonw.exe_Python_Subprocess - Fatal编程技术网

子进程Popen不使用pythonw.exe

子进程Popen不使用pythonw.exe,python,subprocess,Python,Subprocess,在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)) tm

在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,则命令将成功完成,但无法访问子进程中的数据。我读到的每一篇文章都说这应该是有效的,但肯定遗漏了什么。任何帮助都将不胜感激

谢谢,
Randy

这可能是使用pythonw.exe时出现的错误

pythonw.exe启动的守护进程无法正常访问标准文件描述符。在脚本中,您需要做的唯一一件事是专门为stdin设置第三个fd:

p = subprocess.Popen(wcmd,
                     startupinfo=startupinfo,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT,
                     stdin=subprocess.PIPE)
procval = p.communicate()
(迟了几年才给出这个答案…)我遇到了同样的问题,发现你应该替换这个:

stdout=子流程.PIPE

为此:

stdin=子流程.PIPE

下面是我对潜在问题的猜测:pythonw在没有stdin的情况下启动进程(这是有意义的,因为没有控制台)。子进程尝试访问stdin,这会导致错误


另一种方法是对stdin使用/dev/null,请参阅此线程以了解有关如何执行此操作的讨论:(除非您希望在stdin上使用devnull)。

您是否碰巧记录了异常信息?我已尝试,但未成功。这很容易复制,所以关于如何获取异常信息的任何想法都会给它一个快照,我不明白。您的代码命中泛型异常块,但您不能向我们显示该异常?将其更改为:“例外情况除外,e”,并记录e。或者只是在最后提高,这样你就可以看到错误是什么了,我运行它捕获e并返回:[错误6]句柄无效链接的可能副本给出了404:(你的答案可能晚了几年,但它仍然帮助了我:)