【发布时间】:2020-05-16 17:41:18
【问题描述】:
我向 PyPI ('nmrsim') 发布了一个库,该库具有以下结构(已编辑为仅包含相关文件/文件夹):
nmrsim
├── nmrsim
│ ├── __init__.py
│ ├── bin
│ │ ├── T1.npz
│ │ ⋮
│ │ └── T11.npz
│ |
│ └── qm.py
│
└── tests
└── test_qm.py
bin 目录包含用于更快计算的二进制文件(部分解的稀疏矩阵)。对于qm.py 发现bin 目录,无论它是从何处安装和调用的(例如,最终用户的主应用程序、模块的测试套件tests/test_qm.py、IDE...),使用对__file__ 的引用,例如在qm.py:
def _tm_cache(nspins):
filename = f'T{nspins}.npz'
bin_dir = os.path.join(os.path.dirname(__file__), 'bin')
path = os.path.join(bin_dir, filename)
try:
T_sparse = sparse.load_npz(path)
return T_sparse
except FileNotFoundError:
<work around missing file>
该库可以成功地 pip 安装并跨平台使用。但是,使用 PyInstaller 创建 1 文件冻结应用程序失败,因为不包括 bin 目录。查看 PyInstaller 和 PyOxidizer 的文档(一种可能的替代方法),似乎 file 的使用对于“冻结”python 应用程序是有问题的。
如何重构这样的代码以避免使用__file__?
【问题讨论】:
标签: python-3.x pyinstaller packaging pyoxidizer