Python 使用 pyinstaller 打包命令行脚本为 exe 后报错

112 天前
 ShihanW

写了一个 python 命令行脚本,在 cmd 使用 python 调用运行正常,但是用 pyinstaller 打包成 win 的可执行程序就报错了,截图如下,

看好像是 argparse 导致,百度谷歌翻了一遍没找到解决办法,V 友能帮忙看看吗。

1087 次点击
所在节点    Python
6 条回复
tomczhen
112 天前
等老夫算一卦看看 bug 出在哪里。
orzfly
112 天前
我不写 python ,但你这看起来打包成 Windows GUI 程序了,我猜是 sys.stdout / sys.stderr 是空的了。
fields
112 天前
直接执行可以但是打包执行报错,这错误信息看不出来什么引起的,给个源码来链接,大家给你看一下
你是不是有动态导入其他库啊
lovelylain
112 天前
def _print_message(self, message, file=None):
if message:
file = file or _sys.stderr
try:
file.write(message)
except (AttributeError, OSError):
pass

@orzfly 你是对的
Vegetable
112 天前
至少在 py3.11 里这个报错已经被捕获了, 从 py2.7 的代码来看,这地方尝试写 file or sys.stderr ,因此可以确定是 sys.stderr 为 None 导致的。
看起来这是 argparse 这个包的设计问题,
可以考虑升级 python 版本,当然这个有点伤筋动骨
可以考虑移除 argparse 的依赖
可以考虑 https://stackoverflow.com/questions/29935283/how-to-set-custom-output-handlers-for-argparse-in-python 魔改 argparse ,其实也只要改一个方法
ShihanW
112 天前
@fields
@lovelylain
@Vegetable
@tomczhen
@orzfly
感谢大家的留言,是我打包方式有问题,@orzfly 确实是打包成 GUI 程序了, 把打包命令-w 去掉就行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009329

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX