【问题标题】:Pyinstaller executable doesn't run processes when hiddenPyinstaller 可执行文件在隐藏时不运行进程
【发布时间】:2019-07-11 16:51:40
【问题描述】:

我正在尝试运行使用 PyInstaller 打包的单文件 python 可执行文件。该脚本包含需要执行的系统命令。但是,当我尝试(在 Windows 上)运行它们时,它们不会执行。问题是,它们只有在使用 PyInstaller 选项 no-console 时才会执行失败,该选项隐藏了控制台并在后台运行。

我正在使用以下选项:--noconsole 和 -F。

我不仅尝试过subprocess.open功能,还尝试过os.popen(),两者都不行。

另外,我需要控制台输出,所以os.system() 不是一个选项...请记住这一点。虽然,这个函数确实执行了命令,所以我认为获取输出是问题所在。我假设我必须更改标准输出或其他内容,或者如果在没有控制台的情况下执行命令,则输出会丢失或从一开始就不会生成。对不起,如果我听起来没有经验。

我的计算机上没有运行任何防病毒软件,并且没有出现 Windows Defender 等消息。我知道这是一个不稳定的组合——在隐藏的情况下运行系统命令——我只想制作一个每分钟杀死另一个程序的非恶意程序。抱歉,如果有任何未澄清的地方......请问是否有任何不清楚的地方。谢谢:)

编辑

这里有一些帮助代码

command = data['command']
command_split = command.split(" ")

p = subprocess.Popen(command_split, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
result = out.decode() if out else err.decode()


io.emit("client:console_output", {
    'output':result,
    'adminID':data['adminID']
})

编辑 2

明白这个功能是在控制台不隐藏的时候起作用的;因此,它与逻辑或代码无关,仅仅是因为它被隐藏了。无论如何,这是输出。

x = "taskkill /im chrome.exe /f"
print(x.split(" "))
-> ['taskkill', '/im', 'chrome.exe', '/f']

【问题讨论】:

  • 如果您禁用控制台,您希望如何获得控制台输出?重定向到文件?
  • 感谢您的评论。我需要将输出作为字符串(如果它没有编码那很好)。例如,我需要将任务列表的输出作为一个字符串。正如我上面所说,我在启用控制台时让它工作,我只需要弄清楚如何让它在隐藏时工作。
  • command_split 是什么,您可以打印并显示示例吗?
  • 已编辑。请记住,它在控制台未隐藏时有效,因此逻辑很好......

标签: python windows macos pyinstaller


【解决方案1】:

您需要使用subprocess.PIPE 将流程输出重定向到变量。您还需要处理子进程stdin 并手动关闭它。 然后,您可以简单地使用 -w 或 --noconsole 标志禁用控制台。

import subprocess
p = subprocess.Popen(["ipconfig"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out, err = p.communicate()
p.stdin.close()
result = out.decode() if out else err.decode()

【讨论】:

  • 感谢您的回复。但是,该命令仍未运行。我已经编辑了我的问题以显示代码
  • @JordanZdimirovic 我差点忘了stdin 的处理程序。现在它应该可以工作了。
  • 谢谢!!它有效,你不知道这对我的大脑造成了多大的伤害。
  • 同样的解决方案(包括 shell=True、stdout=subprocess.PIPE、stdin=subprocess.PIPE)在使用subprocess.run 供其他任何路过的人使用时也适用。还有一个问题是,当从 Qthread 调用时,控制台窗口会不断产生并中断 UI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2015-04-25
  • 2020-10-29
相关资源
最近更新 更多