首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在skyfield中使用pyinstaller,构建.exe但运行失败

尝试在skyfield中使用pyinstaller,构建.exe但运行失败
EN

Stack Overflow用户
提问于 2020-07-28 12:20:37
回答 3查看 159关注 0票数 0

我试图用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,这样当它被提取/运行时就会存在?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2021-04-30 16:53:12

您需要添加一个包含skyfield数据文件(npz、npy等)的目录。

例如,如果skyfield位于虚拟环境文件夹中,则需要以下pyinstaller调用:

代码语言:javascript
复制
pyinstaller --onefile --add-data 'venv/Lib/site-packages/skyfield/data;skyfield/data' yourapp.py
票数 1
EN

Stack Overflow用户

发布于 2020-07-29 02:26:41

在skyfield的代码中,它似乎认为该文件属于包"skyfield":

代码语言:javascript
复制
data = get_data('skyfield', 'data/{0}'.format(filename))

但在Skyfield的setup.py中,该文件属于子包skyfield.data

代码语言:javascript
复制
package_data = {
    'skyfield': ['documentation/*.rst'],
    'skyfield.data': ['Leap_Second.dat', 'deltat.data', 'deltat.preds',
                      '*.npy', '*.npz'],
    'skyfield.tests': ['data/*'],
    },

如果您能够编辑Skyfield的本地副本,请尝试从skyfield/functions.py更改上面引用的代码行,使其显示为:

代码语言:javascript
复制
data = get_data('skyfield.data', '{0}'.format(filename))

这一更改可能会解决PyInstaller的问题。如果是这样的话,我会正式修改Skyfield的代码!

票数 0
EN

Stack Overflow用户

发布于 2020-09-27 08:29:18

我能够在Win10上构建一个可以正常工作的myprog.exe "onefile“

python 3.7.9

pyinstaller 4.0

skyfield 1.29

通过使用以下命令构建等级库文件

代码语言:javascript
复制
pyinstaller -F myprog.py

然后在spec文件中,更改行

代码语言:javascript
复制
datas=[],

代码语言:javascript
复制
datas=[ ('C:\\Users\\Administrator\\Anaconda3\\pkgs\\skyfield-1.28-pyh9f0ad1d_0\\site-packages\\*', 'skyfield')],

我使用的build命令是

代码语言:javascript
复制
pyinstaller -clean myprog.spec

我不相信Anaconda和它有任何关系,那只是我的安装中有skyfield包数据的地方。不过,我是在一个标准的Python虚拟环境中构建的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63126972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档