替代使用 __file__ 在我的 python 包中找到二进制文件夹

Alternative to using __file__ find the binary folder in my python package

我向 PyPI ('nmrsim') 发布了一个具有以下结构的库(已编辑为仅包含相关的 files/folders):

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 的使用似乎对 "freezing" python 应用程序有问题。

我该如何重构这样的代码以避免使用 __file__

我找到了可行的解决方案:

  1. __init__.py 添加到 bin 文件夹。
  2. 将 bin 文件夹作为模块导入,例如qm.py 将有一个 'import nmrsim.bin' 语句。
  3. 使用importlib.resources.path创建上下文管理器对象:
filename = f'T{nspins}.npz'
path_context = resources.path(nmrsim.bin, filename)
  1. 使用带有"with...as"块的上下文管理器来获取路径:
with path_context as p:
    path = p