我正在尝试运行与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']
答案 0 :(得分:2)
您需要使用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()