【发布时间】: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