如何解决当你的包被其他人导入时,如何让 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 举报,一经查实,本站将立刻删除。