有时候我们需要在程序里执行一些cmd命令,使用os或者其它模块中的popen方法去执行
这个问题一般是程序内有输入导致的,这个输入可以是input(),也可以是其它的一些stdin操作(如os.popen实际上会造成输入请求)
本质上就是:使用-w参数(无控制台)打包时程序里不要请求输入
或者,你也可以不用-w参数,手动隐藏控制台!
有一天,我把使用了os.popen方法的python程序用pyinstaller打包成exe(用了无控制台打包参数-w)
双击运行时程序却弹框报错!
我就有点纳闷:为什么有控制台打包出来的exe(不使用-w参数)可以运行,使用-w参数(无控制台)打包的却不能运行呢?
首先,调用os.popen部分的代码大概是下面这样的:
with os.popen('taskkill /f /t /im nginx.exe') as re: # 杀掉nginx
result = re.read()
执行cmd,杀死nginx。
经过研究,上结论:
os.popen 会打开一个管道执行命令,而管道是有输入(stdin)、输出(stdout) 的!
重点就在输入(stdin)这里:
当我们使用pyinstaller的-w 参数(或Console=False)打包exe时,python解释器是不带控制台的,
所以它没有办法处理输入(stdin) !
包括使用python的input()函数也是不行的,都会弹框报错。
那么怎么办呢?接着看!
os.popen 实际上是一个简单的封装,我们先来看他的原型:subprocess.popen
subprocess.Popen(
args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
<