我正在尝试运行用 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']
最佳答案
您需要使用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()
关于python - Pyinstaller 可执行文件在隐藏时不会运行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993993/