Python脚本使用pyinstaller打包运行时,报get_handles OSError: [WinError 6] 句柄无效的解决方法
一、错误信息
File "subprocess.py", line 728, in __init__ File "subprocess.py", line 1025, in _get_handles OSError: [WinError 6] 句柄无效。
二、解决方法
使用 pyinstaller 打包 python 程序,使用 - w 参数,去掉 console,发现执行命令行的 subprocess 相关语句报 “[ERROR] [WinError 6] 句柄无效” 的错误。
去掉 - w 参数,将 console 显示的话,就正常。
我原本的语句是:
#用 subprocess.check_output获取adb devices命令运行的输出
deviceInfo = subprocess.check_output('adb devices').decode().split("\r\n")
这里需要获得命令的运行输出,试了好多方案,最终可行的方案是用 subpross.Popen 来替代 subprocess.check_output,
Popen 函数加入如下参数:
shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
Popen 方法执行命令,父进程不会等待子进程。这个时候需要用 wait () 方法来等待运行的结果。
这里用自己写的 subprocess_check_output 来替代 subprocess.check_output 代码如下:
def subprocess_check_output(*args):
p = subprocess.Popen(*args,shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
msg = ''
for line in p.stdout.readlines():
msg += line.decode()
status = p.wait()
return msg
deviceInfo = subprocess_check_output('adb devices').split("\r\n")
这样就解决了这个问题。
三、打包指令
@echo off
echo py文件自动打包工具
set file_path="XXX.py"
echo.
echo 目标文件路径=%file_path%
echo.
pyinstaller -F -i .\XXX.ico %file_path%
echo 打包完成.
start .\dist
pause