当您的包被其他人导入时,如何让pyInstaller查找数据文件

2024-04-19 19:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

作为^{}包的用户,我遇到了一个我无法解决的一般问题。 包裹很小,是一个很好的候选者

simples脚本如下(我称之为main.py):

from iapws import IAPWS97

def main():
    h = IAPWS97(P=1, x=1).h
    print(f"h = {h:.5g} kJ/kg")

if __name__ == "__main__":
    main()

这个脚本很好用。通过pyinstaller main.py打包此文件将创建dist\main文件夹,其中包含main.exe。 执行main.exe产生

Traceback (most recent call last):
  File "main.py", line 3, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
  File "iapws\__init__.py", line 15, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\...\\dist\\main\\iapws\\VERSION'
[22492] Failed to execute script main

这里的问题是缺少VERSION文件,即iapws包的数据文件,作为导入包的打包者,我不必担心这个文件。我克隆了iapws包,并试图以多种方式在setup.py中指定VERSION数据文件,但pyInstaller无法获取它

如何在iapws包内指定什么来触发pyInstaller拾取此类数据文件?

此问题与iapws开发人员here沟通


Tags: 文件inpy脚本mainversion数据文件line
1条回答
网友
1楼 · 发布于 2024-04-19 19:09:50

为此,pyInstaller允许应用钩子。在本例中,使用内容创建一个名为hook-iapws.py的钩子

from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files('iapws')

作为包的用户,可以通过指向pyinstaller文件中的包含目录来找到钩子:

a = Analysis(...
             hookspath=["pyinstaller-hooks"],
             ...)

作为包的开发人员,钩子可以通过pyInstaller找到,如in this link所述,或者通过向pyInstaller开发人员提供钩子文件

相关问题 更多 >