微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决当你的包被其他人导入时,如何让 pyInstaller 找到数据文件

作为 iapws 软件包的用户,我遇到了一个无法解决的一般问题。 包很小,很好看。

一个简单的脚本如下(我称之为 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 包,并尝试以多种方式在 VERSION 中指定 setup.py 数据文件,但 pyInstaller 没有选择它。

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

此问题已与 iapws 位开发者 here 沟通。

解决方法

为此,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 开发人员提供钩子文件来找到钩子。 >

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。