替代使用 __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__
?
我找到了可行的解决方案:
- 将
__init__.py
添加到 bin
文件夹。
- 将 bin 文件夹作为模块导入,例如
qm.py
将有一个 'import nmrsim.bin' 语句。
- 使用importlib.resources.path创建上下文管理器对象:
filename = f'T{nspins}.npz'
path_context = resources.path(nmrsim.bin, filename)
- 使用带有"with...as"块的上下文管理器来获取路径:
with path_context as p:
path = p
我向 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__
?
我找到了可行的解决方案:
- 将
__init__.py
添加到bin
文件夹。 - 将 bin 文件夹作为模块导入,例如
qm.py
将有一个 'import nmrsim.bin' 语句。 - 使用importlib.resources.path创建上下文管理器对象:
filename = f'T{nspins}.npz'
path_context = resources.path(nmrsim.bin, filename)
- 使用带有"with...as"块的上下文管理器来获取路径:
with path_context as p:
path = p