别再问我怎么Python打包成exe了!

作者 | Python进阶者
来源 | Python爬虫与数据挖掘

阅读文本大概需要 10 分钟

前言

也许我们不一定是专业的程序员,但是我们仍然可以通过代码提高我们的效率,尽量少加班,多陪陪媳妇(如果有)。再不行,让代码替我们干着重复的工作,我们有节省出来的时间打游戏不好嘛,是吧,哈哈哈。

但是呢,我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安装我们用的那些第三方包,是不是有点小麻烦?但是我们都知道,PC是可以直接运行exe文件的,这就为我们提供了一个便捷的方式。所以,从看了这个教程以后,这都将成为过去式,打成exe之后,分享即可用。

PS: 如果打包为exe的话,版本尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序,但是如果不考虑32位系统的话无所谓,直接python64位版本直接打包就可以,只是只能在win64位系统上跑。

安装pyinstaller

首先安装pyinstaller,使用安装命令:pip3 install pyinstaller,如下图所示。

pyinstaller打包机制

我们写的python脚本是不能脱离python解释器单独运行的,所以在打包的时候,至少会将python解释器和脚本一起打包,同样,为了打包的exe能正常运行,会把我们所有安装的第三方包一并打包到exe。

即使我们的项目只使用的一个requests包,但是可能我们还安装了其他n个包,但是他不管,因为包和包只有依赖关系的。比如我们只装了一个requests包,但是requests包会顺带装了一些其他依赖的小包,所以为了安全,只能将所有第三方包+python解释器一起打包。如下图所示。

蓝色表示是安装requests依赖的包,看到了吧!

Pyinstaller打包exe

这里呢,我就拿刚给同事写办公自动化脚本示例一下。源码示例效果,如下图所示。

1、我们来将这个.py的文件打包成一个exe,我们直接cmd切换到这个脚本的目录,执行命令:pyinstaller-F setup.py,如下图所示。

ps: -F参数表示覆盖打包,这样在打包时,不管我们打包几次,都是最新的,这个记住就行,固定命令。

2、执行完毕之后,会生成几个文件夹,如下图所示。

3、在dist里面呢,就有了一个exe程序,这个就是可执行的exe程序,如下图所示。

4、我们把这个setup.exe拖到和setup.py平级的目录,我们来运行一下这个,效果图如下图所示。

5、这样,我们就完成了一个打包工作,如果别人需要,即使没有python环境,他依然可以运行。

6、接下来我们再来打包一个带界面的,这里我用pyqt5写了一个最简单的框架,看一下打包成exe是否能运行成功,效果图如下图所示。

我们可以看到,后面有一个黑洞洞的窗口,这就有点尴尬了,所以,我们的打包命令也要变一下。

7、执行 pyinstaller -F -wsetup.py 多加-w以后,就不会显示黑洞洞的控制台了,这里就不做演示啦!

8、但是我们打包的exe,我们的图标呀,实在是有点丑陋,默认的,没有一点自己的风格,那么,我们应该怎么改一下呢?

执行命令:pyinstaller -F -w-i wind.ico setup.py,如下图所示。

9、默认打包图片,如下图所示。

10、加上 -i 参数之后,如下图所示,会形成一个类似风力发电机的logo图案。

ps:程序路径最好全部都是英文,否则可能会出现莫名其妙的问题

11、到此,我们能用到的pyton打包成exe命令都总结完了

总结命令

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不带控制台的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

平常我们只需要这三个就好了,足够满足所有需求了。

结语

到这之后呢,python打包成exe基本算是结束了,记得一定要把pip升级成最新版的pip在安装pyinstaller哈。要不然可能会出现莫名奇妙的问题。

不信的话小伙伴们可以自己试试看,多碰碰壁也是可以学到很多的。

end

近期八大热门:

发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片!
盗墓热再起!我爬取了6万条《重启之极海听雷》的评论,发现了这些秘密
用Python一键生成炫酷九宫格图片,火了朋友圈
菜鸟也疯狂!8分钟用Python做一个酷炫的家庭随手记
Github获8300星!用Python开发的一个命令行的网易云音乐
一道Python面试题,硬是没憋出来,最后憋出一身汗!卧槽!Pdf转Word用Python轻松搞定!教你6招,不错的Python代码技巧!
由 菜鸟学Python 原班人马打造的公众号:程序员GitHub,现已正式上线!
接下来我们将会在该公众号上,为大家分享GitHub上优质的开源神器,程序员圈的趣事,坚持每天一篇原创文章的输出,感兴趣的小伙伴可以关注一下哈!

点这里,领取新手福利
<think>好的,用户的是如何将Python代码打包exe后,获取与exe同目录下的文件。我需要仔细思考这个题,确保给出的方法正确且容易理解。 首先,用户可能在打包后遇到路径题,因为exe运行时的工作目录可能不是exe所在的目录。比如,如果用户双击exe运行,当前工作目录可能是C:\Windows\System32,而不是exe所在的位置。这会导致程序找不到同目录下的文件。 接下来,我需要回忆Python中处理路径的方法。通常,使用os模块中的os.getcwd()获取当前工作目录,但这可能不可靠,因为工作目录可能变化。正确的做法应该是获取exe所在的绝对路径,然后基于这个路径构建文件路径。 然后想到,当Python脚本被打包exe后,sys.argv[0]会包含exe的路径。可以用os.path.abspath(sys.argv[0])来获取exe的绝对路径,再用os.path.dirname()提取目录部分。这样就可以得到exe所在的目录路径了。 然后,用户需要访同目录下的文件,比如配置文件或数据文件。这时候,应该将目标文件的路径构建为exe目录加上文件名。例如,如果文件是config.json,那么完整路径就是os.path.join(exe_dir, 'config.json')。 可能还需要考虑打包时包含这些文件。比如在使用PyInstaller时,需要配置.spec文件,或者使用--add-data参数,确保这些文件被包含进exe的生目录中。否则,即使路径正确,文件也可能不存在。 另外,可能会遇到的题:用户可能在开发时使用相对路径,比如open('data.txt'),这在脚本运行时正常,但打包后工作目录改变导致找不到文件。所以必须用绝对路径,基于exe的位置来定位文件。 还要注意,不同操作系统路径分隔符的题,使用os.path.join可以自动处理,保证跨平台兼容性。 总结步骤应该是:获取exe所在目录,构建目标文件的绝对路径,然后使用这个路径进行文件操作。同时确保打包时包含所需文件。 可能还需要举一个具体的例子,比如读取同目录下的config.json文件,展示如何正确获取路径并打开文件。 另外,提醒用户处理文件不存在的情况,比如使用try-except块捕获异常,避免程序崩溃。 最后,关于PyInstaller的具体使用方法,可能需要给出打包命令示例,比如pyinstaller --add-data "config.json;." script.py,确保文件被正确添加到打包后的目录中。 总之,关键在于正确获取exe所在目录的路径,并基于此构建文件路径,同时确保文件被打包进去,这样才能在exe运行时正确访同目录下的文件。</think>当将Python代码打包EXE文件后,获取同目录文件的正确方法如下: ### 核心原理 在EXE运行时,`os.getcwd()`获取的可能是系统工作目录而非EXE所在目录。需要通过`sys.argv[0]`解析可执行文件路径: $$ \text{exe路径} = os.path.dirname(os.path.abspath(sys.argv[0])) $$ ### 具体步骤 1. **获取EXE所在目录** ```python import sys, os def get_exe_dir(): if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) return os.path.dirname(os.path.abspath(__file__)) exe_dir = get_exe_dir() ``` 2. **构建文件路径** ```python target_file = os.path.join(exe_dir, "your_file.txt") ``` 3. **验证文件存在性** ```python if not os.path.exists(target_file): raise FileNotFoundError(f"在目录 {exe_dir} 中未找到文件") ``` ### 关键注意事项 - **PyInstaller打包配置**:需在.spec文件中添加数据文件 ```python datas=[('source_file.txt', '.')] ``` 或使用命令行参数: ```bash pyinstaller --add-data "source_file.txt;." your_script.py ``` - **路径标准化**:推荐使用`pathlib`增强兼容性 ```python from pathlib import Path exe_path = Path(sys.executable if getattr(sys, 'frozen', False) else __file__).parent ``` ### 典型错误处理 ```python try: with open(target_file, 'r') as f: data = f.read() except IOError as e: print(f"文件读取失败:{str(e)}") ``` ### 技术细节说明 1. `sys.frozen`属性是PyInstaller注入的打包标记 2. `sys.executable`在打包后会指向EXE文件路径 3. 使用`os.path.abspath()`确保获得绝对路径 4. 开发环境与打包环境需保持路径访方式的一致性 建议在开发阶段就使用这种路径获取方式,避免开发环境和打包环境行为不一致的题。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值