问题描述
作为 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 开发人员提供钩子文件来找到钩子。 >