【问题标题】:Subprocess Popen not working with pythonw.exe子进程 Popen 不适用于 pythonw.exe
【发布时间】:2012-04-24 02:26:47
【问题描述】:

当我使用 pythonw.exe 在 windows 上运行以下脚本时,我希望能够获取 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,则命令将成功完成,但无法访问子进程中的数据。我读到的所有内容都表明这应该有效,但必须遗漏一些东西。任何帮助将不胜感激。

谢谢, 兰迪

【问题讨论】:

  • 您是否碰巧记录了异常信息?
  • 我尝试过但没有成功。这很容易复制,所以任何关于如何获取异常信息的想法都会试一试
  • 我不明白。您的代码遇到了通用的 except 块,但您无法向我们展示该异常?将其更改为:“except Exception, e”并记录 e。或者只是在最后提出,这样你就可以看到错误是什么
  • 我运行它捕获 e 并返回:[错误 6] 句柄无效

标签: python subprocess


【解决方案1】:

这可能是使用 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()

【讨论】:

  • 链接给出了 404 :(
【解决方案2】:

(这个答案晚了几年......)我遇到了同样的问题,发现你应该替换这个:

stdout=subprocess.PIPE

用这个:

stdin=subprocess.PIPE

这是我对潜在问题的猜测:pythonw 启动没有标准输入的进程(有道理,因为没有控制台)。子进程尝试访问标准输入,这会导致错误。

另一种方法是将 /dev/null 用于标准输入,有关如何执行此操作的讨论,请参阅此线程:Ignoring output from subprocess.Popen(除非您希望在标准输入上使用 devnull)。

【讨论】:

  • 你的答案可能晚了几年,但它仍然帮助了我:)
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多