【问题标题】:Trying to use pyinstaller with skyfield, building .exe but failing to run尝试将pyinstaller与skyfield一起使用,构建.exe但无法运行
【发布时间】:2021-04-30 16:53:11
【问题描述】:

我正在尝试使用 pyinstaller 打包一个使用 skyfield 模块/API 的脚本,并且它可以构建,但是当我运行它时,它死了说它找不到 nutation.npz(包含在 @ 987654322@_arrays = load_bundled_npy('nutation.npz'))。

我尝试过使用--onefile,但没有使用它。 --add-data--add-binary 不喜欢它。 --hidden-imports 没有帮助。 --debug=imports 用处不大,但附上的日志来自--debug=all 编译。

关于如何强制 pyinstaller 将 nutation.npz 包含到构建的 .exe 中以便在提取/运行时它存在的任何想法?

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

【问题讨论】:

  • 你是否从pyinstaller生成的文件夹中移动了.exe文件
  • 不。 --onefile 和 not onefile 都在他们构建的地方运行

标签: python python-3.x pyinstaller skyfield


【解决方案1】:

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

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

pyinstaller --onefile --add-data 'venv/Lib/site-packages/skyfield/data;skyfield/data' yourapp.py

【讨论】:

    【解决方案2】:

    在 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的代码!

    【讨论】:

    • 我试过:data = get_data('skyfield.data', '{0}'.format(filename)) 和 data = get_data('skyfield.data', 'data/{0}' .format(filename)) 没有骰子。使用 --onefile 也找不到它。但是,我可以在不使用 --onefile 时在 dist 文件夹中手动创建 skyfield/data 目录,然后手动将所有数据文件放入其中,然后运行,但不必这样做就好了。跨度>
    • 唉!我曾希望这会奏效。 Skyfield 在其setup.pyMANIFEST 中都列出了该文件,据我所知,没有其他地方可以添加它。如果我想到其他可以尝试的方法,我会告诉你的!
    【解决方案3】:

    我能够在 Win10 上构建 myprog.exe 的工作“一个文件”

    python 3.7.9
    pyinstaller 4.0
    天域 1.29

    通过使用命令构建规范文件

    pyinstaller -F myprog.py
    

    然后在规范文件中,更改行

    datas=[],
    

    datas=[ ('C:\\Users\\Administrator\\Anaconda3\\pkgs\\skyfield-1.28-pyh9f0ad1d_0\\site-packages\\*', 'skyfield')],
    

    我使用的构建命令是

    pyinstaller -clean myprog.spec
    

    我不相信 Anaconda 与它有任何关系,这就是我的安装有 skyfield 包数据的地方。不过,我确实在标准 Python 虚拟环境中构建了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2018-10-07
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多