【问题标题】:Alternative to using __file__ find the binary folder in my python package替代使用 __file__ 在我的 python 包中找到二进制文件夹
【发布时间】: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


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2021-12-19
      • 2021-09-16
      • 2021-05-22
      • 2022-11-03
      • 2013-04-10
      • 1970-01-01
      • 2021-04-26
      相关资源
      最近更新 更多