сгенерированный pyinstaller исполняемый файл не может найти octave_kernel \kernel.json

#python #pyinstaller #oct2py

#python #pyinstaller #oct2py

Вопрос:

Я пытаюсь повторно использовать некоторый код octave (в файле 1 .m) в коротком скрипте python с использованием oct2py. Скрипт python корректно запускается с консоли cmd. Я даже могу упаковать его в exe-файл с помощью pyinstaller (без ошибок, только несколько предупреждений), но когда я запускаю его, исполняемый файл выдает эту ошибку и завершает работу:

 ---

C:UsersJasonDesktopOct2Py test>readFolder.exe
Traceback (most recent call last):
  File "readFolder.py", line 2, in <module>
    from oct2py import octave
  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:python37libsite-packagesPyInstallerloaderpyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packagesoct2py__init__.py", line 26, 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:python37libsite-packagesPyInstallerloaderpyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packagesoct2pycore.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:python37libsite-packagesPyInstallerloaderpyimod03_importers.py", line 627, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packagesoctave_kernelkernel.py", line 49, in <module>
  File "site-packagesoctave_kernelkernel.py", line 54, in OctaveKernel
  File "site-packagesoctave_kernelkernel.py", line 43, in get_kernel_json
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\toshiba\AppData\Local\Temp\_MEI94962\octave_kernel\kernel.json
[5220] Failed to execute script readFolder
  

У меня установлены последние версии python (3.7.1), oct2py (4.0.6), pyinstaller и т.д.

Такое ощущение, что я что-то упускаю или где-то здесь что-то не подключаю, кто-нибудь может мне с этим помочь? Спасибо!

Комментарии:

1. Решено! Мне нужно было установить переменную OCTAVE_KERNEL_JSON env.

2. не могли бы вы, пожалуйста, показать мне, как вы установили переменную env?

Ответ №1:

У меня была та же проблема, и, как сказал DNR, я решил установить переменную OCTAVE_KERNEL_JSON. Чтобы сделать это:

  1. Добавление файла kernel.json в качестве файла данных в файле спецификации, что объясняется здесьhttps://pyinstaller.readthedocs.io/en/v3.4/spec-files.html#adding-files-to-the-bundle.

Пример:

 a = Analysis(...
     datas=[ ('/home/user/miniconda3/envs/env/lib/python3.8/site-packages/octave_kernel/kernel.json', 'octave_kernel') ],
     ...
     )
  
  1. Присваиваю новый путь kernel.json переменной env, добавив это в мой код перед импортом oct2py
      if getattr(sys, 'frozen', False):
        application_path = sys._MEIPASS
        os.environ["OCTAVE_KERNEL_JSON"] = os.path.join(application_path, 'octave_kernel/kernel.json')