pyinstaller 打包 如何正常读取文件中的内容
时间: 2023-07-19 20:03:44 浏览: 55
当使用 PyInstaller 打包 Python 代码时,有时候会遇到读取文件中的内容异常的问题。这是因为 PyInstaller 默认会将所有的 Python 模块和依赖打包到一个单独的可执行文件中,导致相对路径等发生变化,从而出现读取文件异常的情况。
解决这个问题的方法是使用 `sys._MEIPASS` 变量获取打包后的文件路径,然后使用完整的绝对路径或者相对于该路径的相对路径来读取文件中的内容。下面是一个示例:
```python
import sys
import os
if hasattr(sys, '_MEIPASS'):
# PyInstaller 打包后的文件路径
base_path = sys._MEIPASS
else:
# 普通 Python 文件路径
base_path = os.path.abspath(".")
# 读取文件中的内容
with open(os.path.join(base_path, "file.txt"), "r") as f:
content = f.read()
```
这样就可以在 PyInstaller 打包后的可执行文件中正常读取文件中的内容了。
相关问题
pyinstaller 打包 如何正常读取文件中的内容 ,本地正常运行
如果您的程序在本地运行时可以正常读取文件,但是在使用 PyInstaller 打包后运行时无法读取文件,那么可能是因为 PyInstaller 将文件打包到了可执行文件中,导致程序无法直接访问原始文件。
解决这个问题的方法有两种:
1. 使用 PyInstaller 的 --add-data 选项将文件添加到打包后的可执行文件中。例如,如果您要将名为 data.txt 的文件添加到可执行文件中,可以使用以下命令:
```
pyinstaller --add-data "data.txt;." your_script.py
```
这将把 data.txt 文件复制到可执行文件的根目录,并将其路径添加到 sys._MEIPASS 变量中。您可以在程序中使用以下代码读取该文件:
```
import sys
with open(sys._MEIPASS + '/data.txt', 'r') as f:
data = f.read()
```
注意,sys._MEIPASS 变量只在打包后的可执行文件中存在。在本地运行程序时,该变量不存在,因此您需要在代码中进行条件判断。
2. 使用绝对路径读取文件。如果您知道文件的绝对路径,可以直接在程序中使用该路径读取文件。例如:
```
with open('/path/to/data.txt', 'r') as f:
data = f.read()
```
这种方法不需要使用 PyInstaller 的 --add-data 选项,但需要确保文件的绝对路径在打包后的可执行文件中存在,并且在不同系统上路径应该是一致的。
pyinstaller打包后读取当前目录
在使用pyinstaller打包后,可以使用以下代码读取当前目录中的文件:
from os import path
file_path = path.dirname(path.realpath(sys.argv))
其中,path.realpath(sys.argv)可以获取当前执行文件的绝对路径,path.dirname()可以获取该路径所在的目录路径。这样就可以方便地读取当前目录中的文件了。