python3 在编辑器和打包成exe后获取当前文件路径的不同

博主在尝试将Python脚本打包成exe时发现,通过不同方式获取路径在编辑器和exe运行环境下结果不一致。具体表现为:在编辑器中,sys.path[0]、sys.argv[0]和os.path.split(os.path.realpath(__file__))[0]返回相同路径,而在exe中只有os.path.dirname(os.path.realpath(sys.executable))和os.path.dirname(os.path.realpath(sys.argv[0]))能正确获取路径。这个问题可能对其他开发者有参考价值。

今天在试验打包exe时,发现在编辑器下和exe中获取路径得到的结果不同,这里记录下来供大家参考:

代码都是一样的,总共5中获取路径的方式,首先代码如下:

current_path = sys.path[0]

current_path = sys.argv[0]

current_path = os.path.dirname(os.path.realpath(sys.executable))

current_path = os.path.dirname(os.path.realpath(sys.argv[0]))

current_path = os.path.split(os.path.realpath(__file__))[0]

编辑器中,分别得到如下结果:

D:\新建文件夹
D:/新建文件夹/rename_gba.py
C:\Users\JF\AppData\Local\Programs\Python\Python310
D:\新建文件夹
D:\新建文件夹

我这个python文件是放在新建文件夹里的,也就是说1,4,5三种方式可以正确获得文件路径。

exe中,分别得到如下结果:

C:\Users\JF\AppData\Local\Temp_MEI100082\base_library.zip
D:\新建文件夹\dist\rename_gba.exe
D:\新建文件夹\dist
D:\新建文件夹\dist
C:\Users\JF\AppData\Local\Temp_MEI100082

可以看出3,4两种方式可以得到正确的路径。

我也不想深究里面的原理,只是写出这种情况,供大家参考。

<think>我们参考用户的问题提供的引用资料,用户希望将多个Python文件打包可执行的exe文件。 根据引用资料,我们可以使用PyInstaller工具来实现。以下是步骤: 1. 安装PyInstaller:可以使用清华镜像快速安装。 2. 创建spec文件:使用`pyi-makespec`命令来生spec文件,指定入口文件参数(如`--onefile`表示打包一个exe文件,`--windowed`表示窗口程序,不显示控制台)。 3. 修改spec文件(如果需要):如果有多个py文件或者数据文件,可以在spec文件中添加。 4. 使用PyInstaller根据spec文件进行打包。 注意:根据引用[2],在conda环境下打包可能会包含很多不必要的库,导致打包文件过大,建议使用纯净的python环境。 具体步骤: 步骤1:安装PyInstaller ```cmd pip install Pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 步骤2:生spec文件 假设我们有两个py文件:main.py(主入口)module.py(依赖模块),我们可以使用以下命令: ```cmd pyi-makespec --onefile --windowed --name=myapp main.py module.py ``` 这里`--name`指定生exe名称,`--onefile`表示打包一个exe,`--windowed`表示窗口程序(如果是命令行程序则不需要这个参数)。注意,如果还有其他py文件,可以继续在后面添加。 步骤3:如果需要添加数据文件(如图片、配置文件等),可以编辑生的spec文件。在`Analysis`部分,可以添加`datas`参数。例如: ```python a = Analysis([&#39;main.py&#39;, &#39;module.py&#39;], pathex=[], binaries=[], datas=[(&#39;images/*.png&#39;, &#39;images&#39;)], # 将当前目录下的images文件夹中的所有png文件打包exe内的images文件夹中 hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) ``` 步骤4:使用spec文件进行打包 ```cmd pyinstaller myapp.spec ``` 打包后,exe文件会出现在`dist`文件夹中。 注意:如果打包单个文件(--onefile),则运行时会将所有文件解压到临时目录,然后执行。如果程序需要读取资源文件,则需要注意路径问题。 另外,引用[3][4]也提到了类似的方法。 为了避免在conda环境下打包过大,建议使用纯净的Python环境(如从python.org下载的官方Python解释器)并创建一个虚拟环境。 下面我们给出一个具体的例子: 假设我们有三个文件: - main.py:主程序 - utils.py:工具函数 - data/config.ini:配置文件 我们想要打包一个exe文件,并且包含配置文件。 步骤: 1. 创建spec文件: ```cmd pyi-makespec --onefile --name=myapp main.py utils.py --add-data "data/config.ini;data" ``` 注意:`--add-data`的格式为`源路径;目标路径`(Windows下用分号分隔,Linux/macOS下用冒号)。这里表示将当前目录下的data/config.ini文件打包exe内部的数据目录的data文件夹下(在运行时,该文件会被解压到临时目录的data文件夹中)。 2. 或者,如果文件较多,也可以直接生spec文件后手动修改。使用上述命令后,会生myapp.spec文件,然后我们可以手动修改datas部分。 3. 然后执行: ```cmd pyinstaller myapp.spec ``` 在代码中访问配置文件时,需要考虑到程序被打包后资源文件的路径问题。可以使用以下方法获取正确的路径: ```python import sys import os # 判断是否是打包环境 if getattr(sys, &#39;frozen&#39;, False): # 如果是打包后的exe,则使用临时目录的路径 base_path = sys._MEIPASS else: base_path = os.path.abspath(".") # 配置文件的路径 config_path = os.path.join(base_path, "data", "config.ini") ``` 注意:在打包时,通过`--add-data`指定的文件会被复制到临时目录的相应路径下,而`sys._MEIPASS`就是临时目录的路径。 最后,生的问题可以围绕打包过程中可能遇到的问题,如路径问题、打包文件过大、如何添加资源文件等。 下面我们按照要求生相关问题。</think>### 如何将多个Python文件打包EXE文件 使用PyInstaller工具可将多个Python文件打包单个EXE文件,以下是详细步骤: #### 1. 安装PyInstaller ```cmd pip install Pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple ``` #### 2. 创建spec配置文件 ```cmd pyi-makespec --onefile --name=myapp main.py module1.py module2.py ``` - `--onefile`:生单个EXE文件 - `--name`:指定输出文件名 - 末尾列出所有需要打包的.py文件(主文件在前) #### 3. 修改spec文件(可选) 若需添加数据文件(如图片/配置文件),在`Analysis`部分添加: ```python a = Analysis( ... datas=[(&#39;assets/*.png&#39;, &#39;assets&#39;)], # 添加资源文件 ... ) ``` #### 4. 执行打包命令 ```cmd pyinstaller myapp.spec ``` 生EXE位于`dist/`目录 #### 5. 路径问题处理(代码中需添加) ```python import sys import os if getattr(sys, &#39;frozen&#39;, False): base_path = sys._MEIPASS # 打包后临时解压路径 else: base_path = os.path.dirname(__file__) config_path = os.path.join(base_path, &#39;config.ini&#39;) ``` > **重要提示**:建议使用纯净Python环境打包,避免conda环境导致文件过大[^2]。230MB+的包在纯净环境通常可压缩到20-50MB。 ### 常见问题解决 1. **文件过大**: - 使用`--exclude-module`排除无用库 - 添加虚拟环境:`python -m venv clean_env` 2. **资源文件丢失**: - 确保spec文件中正确配置`datas` - 代码中使用`sys._MEIPASS`获取路径 3. **杀毒软件误报**: - 添加数字签名 - 使用`--uac-admin`申请管理员权限 > 通过spec文件可保存配置,后续修改代码后只需重新运行`pyinstaller myapp.spec`即可更新[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值