English 中文(简体)
Python subprocess.call()在使用pythonw.exe时失败
原标题:
  • 时间:2008-12-03 16:54:17
  •  标签:

当我使用python.exe运行时,我的一些Python代码正常工作,但如果我使用pythonw.exe则失败。

    def runStuff(commandLine):
        outputFileName =  somefile.txt 
        outputFile = open(outputFileName, "w")

        try:
            result = subprocess.call(commandLine, shell=True, stdout=outputFile)
        except:
            print  Exception thrown: , str(sys.exc_info()[1])

    myThread = threading.Thread(None, target=runStuff, commandLine=[ whatever... ])
    myThread.start()

我收到的消息是:

    Exception thrown: [Error 6] The handle is invalid

然而,如果我不指定 stdout 参数,subprocess.call() 就可以正常启动。

我可以看到pythonw.exe可能会重定向输出本身,但我不明白为什么我无法指定新线程的stdout。

最佳回答

sys.stdinsys.stdout句柄无效,因为Pythonw不提供控制台支持,而作为守护程序运行,因此subprocess.call()的默认参数失败了。

恶魔程序有意关闭标准输入/标准输出/标准错误,并使用日志记录代替,因此您必须自行管理:我建议使用subprocess.PIPE。

如果您真的不关心子进程对错误的提示,您可以使用os.devnull(我不是很确定它有多便携?),但我不建议这样做。

问题回答

记录一下,我的代码现在是这样的:

def runStuff(commandLine):
    outputFileName =  somefile.txt 
    outputFile = open(outputFileName, "w")

    if guiMode:
        result = subprocess.call(commandLine, shell=True, stdout=outputFile, stderr=subprocess.STDOUT)
    else:
        proc = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
        proc.stdin.close()
        proc.wait()
        result = proc.returncode
        outputFile.write(proc.stdout.read())

请注意,由于子进程模块中明显存在的错误,对Popen()的调用必须指定stdin的管道,随后我们立即关闭它。

这是一个老问题,但使用pyInstaller也出现了相同的问题。

事实上,任何将Python代码转换为无控制台exe的框架都会发生这种情况。

在我的测试中,我观察到如果我在我的spec文件(pyInstaller)中使用标志“console=True”,那么错误就不再出现了。

解决方案是遵循彼得·莱斯尼基的提示。





相关问题
热门标签