【问题标题】:Python not retrieving stdout from subprocess Popen exe filePython没有从子进程Popen exe文件中检索标准输出
【发布时间】:2020-07-05 06:42:28
【问题描述】:

我知道有很多类似的问题,但我真的不知道我做错了什么。 我想要完成的事情是:从之前从.py 编译的.exe 文件中读取stdout

这是执行子进程的主程序

from subprocess import Popen, PIPE, STDOUT


runcloud = Popen([r'demo2.exe'], stdout=PIPE)
with runcloud.stdout:
    for line in iter(runcloud.stdout.readline, b''):
        print(line)  ##PRINTS NOTHING ??

这是编译前的.exe文件(demo2.exe)

import os

try:
    print('RESPONSE')
except:
    print('no connection')

os._exit(0)

对于某些实现,我需要编译demo2并添加os._exit()的最后一行 .虽然这个.exe 文件在 cmd 中运行时它确实显示了打印字符串。但无法使用subprocess从主程序打印


编辑: 在一些 cmets 之后,我在没有编译文件的情况下运行了代码,并添加了关键字 python,但仍然没有打印任何内容。 评论:即使我让它与 py 文件一起运行或者只是删除 os._exit(0),它仍然没有打印任何内容,请注意我的目录中没有其他同名的文件。


编辑 - 解决方法: 在找到解决方案数小时后,唯一的解决方法是在 exe 文件中编写代码保存(我认为我不能将其称为 '重定向')在另一个文件(如.txt)或简单设置数据库(如SQlite)上的输出,然后在主程序中调用Popen以使用.wait()执行exe并通过读取写入的值完成在文件或数据库上。 由于我还没有弄清楚为什么 Popen 没有在 stdout 中捕获 print 函数,并且已经可以在其他问题中找到解决方法,所以我暂时保留这个问题。强>

【问题讨论】:

  • 请注意,您可以只使用for line in runcloud.stdout:
  • @MisterMiyagi 仍然没有打印
  • 经过小幅修正以使此示例可运行(将 demo.exe 更改为 ./demo2.py),我无法重现此问题。你如何编译文件?文件未编译时是否有效?由于指定的可执行文件没有路径,你确定你运行的是正确的demo2.exe吗?
  • @MisterMiyagi 对不起,我忘记了 python 关键字,好的,所以我像使用 py 文件一样运行它。它仍然不打印任何内容。

标签: python python-3.x compilation subprocess stdout


【解决方案1】:

首先,您应该放置一个 demo2.exe 的路径,即如果 exe 与主程序位于同一目录中,则您的字符串应为 r'./demo2.exe'(如果不是,则为完整路径)。然后,尝试从您的 demo2 文件中删除 os._exit(0) 调用。您也可以尝试使用 subprocess check_output 进行此类调用,它简化了代码:

from subprocess import check_output

output = check_output([r'./demo2'])
print(output)

【讨论】:

  • os._exit(0) 是必需的,因为我正在实现 python-firebase 模块,编译后应用程序将不断重启,直到电脑崩溃,这会在第一次调用时停止程序。
  • 好吧,我试过你的代码,它打印了b'',即使我删除了os._exit(),它仍然什么也没打印。我不明白为什么。
  • 是的,我更新了所有内容,我能够解决问题,但无法弄清楚为什么子进程没有将打印功能作为标准输出读取
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2013-03-20
  • 2011-04-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多