我试图用pyinstaller打包一个脚本,它使用了skyfield模块/API,但当我运行它时,它死了,说它找不到nutation.npz ( nutationlib.py _arrays = load_bundled_npy('nutation.npz')中包含的一个数据文件)。
我尝试过使用--onefile,而不是使用它。--add-data和--add-binary不喜欢这样。--hidden-imports帮不上忙。--debug=imports不是很有用,但是附加的日志来自--debug=all编译。
有没有想过如何强制pyinstaller在构建的.exe中包含nutation.npz,这样当它被提取/运行时就会存在?
import skyfield.nutationlib # PyInstaller PYZ
Traceback (most recent call last):
File "satvis.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "c:\users\fox\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\skyfield\api.py", line 11, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "c:\users\fox\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\skyfield\constellationlib.py", line 29, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "c:\users\fox\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\skyfield\timelib.py", line 14, in <module>
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "c:\users\fox\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\skyfield\nutationlib.py", line 7, in <module>
File "site-packages\skyfield\functions.py", line 143, in load_bundled_npy
File "pkgutil.py", line 637, in get_data
File "c:\users\fox\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 471, in get_data
with open(path, 'rb') as fp:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\fox\\AppData\\Local\\Temp\\_MEI89762\\skyfield\\data\\nutation.npz'
[44412] Failed to execute script satvis发布于 2021-04-30 16:53:12
您需要添加一个包含skyfield数据文件(npz、npy等)的目录。
例如,如果skyfield位于虚拟环境文件夹中,则需要以下pyinstaller调用:
pyinstaller --onefile --add-data 'venv/Lib/site-packages/skyfield/data;skyfield/data' yourapp.py发布于 2020-07-29 02:26:41
在skyfield的代码中,它似乎认为该文件属于包"skyfield":
data = get_data('skyfield', 'data/{0}'.format(filename))但在Skyfield的setup.py中,该文件属于子包skyfield.data:
package_data = {
'skyfield': ['documentation/*.rst'],
'skyfield.data': ['Leap_Second.dat', 'deltat.data', 'deltat.preds',
'*.npy', '*.npz'],
'skyfield.tests': ['data/*'],
},如果您能够编辑Skyfield的本地副本,请尝试从skyfield/functions.py更改上面引用的代码行,使其显示为:
data = get_data('skyfield.data', '{0}'.format(filename))这一更改可能会解决PyInstaller的问题。如果是这样的话,我会正式修改Skyfield的代码!
发布于 2020-09-27 08:29:18
我能够在Win10上构建一个可以正常工作的myprog.exe "onefile“
python 3.7.9
pyinstaller 4.0
skyfield 1.29
通过使用以下命令构建等级库文件
pyinstaller -F myprog.py然后在spec文件中,更改行
datas=[],至
datas=[ ('C:\\Users\\Administrator\\Anaconda3\\pkgs\\skyfield-1.28-pyh9f0ad1d_0\\site-packages\\*', 'skyfield')],我使用的build命令是
pyinstaller -clean myprog.spec我不相信Anaconda和它有任何关系,那只是我的安装中有skyfield包数据的地方。不过,我是在一个标准的Python虚拟环境中构建的。
https://stackoverflow.com/questions/63126972
复制相似问题