компиляция с использованием внешнего pythonpath pyinstaller, который находится в другом программном модуле - PullRequest
0 голосов
/ 18 апреля 2020

Я создал программу в python, где она вызывает внешний модуль python из коммерческой программы. Что касается моего анализа, я должен отметить, что я не программист и не эксперт, этот модуль имеет значение python над C. Библиотека находится в расширении pyd, и для вызова в сценарии python она должна иметь переменную вызова среды pythonpath, которую можно использовать только в python 3.4 или 3.5. Мне удается обойти это, используя sys.path.insert(0, path), где путь - это путь к модулю, который нужно загрузить или вызвать, не обращаясь к переменной окружения или необходимости ее определения. Структура модуля выглядит следующим образом:

caris \

   __init__.py

  _py_caris.pyd

caris__pycache __ \

              ......

caris \ bathy \

         .....

caris \ cover \

           ....

caris \ ui \

     ....

Мой скрипт имеет PyQt5 gui и работает поверх этого модуля или является "оболочкой" для этого модуля , При компиляции с помощью pyinstaller процесс запуска начинается с файла bat.

"C:\Program Files\Python35\Scripts\pyinstaller.exe" -n "Point Cloud" --clean -y ^
-c --debug=imports ^
--exclude-module=caris ^
--add-data="ReadAPointCloudFromAPLYFileExample_01.png;." ^ ^
--icon=Point_Cloud.ico ^
PC.py

Я пробовал некоторые варианты, но без улучшения.

Это отрывок из вывода, если я не использую --exclude-module=caris при компиляции.

133910 ВНИМАНИЕ: lib не найдена: cscataloginfou.dll зависимость C: \ Program Files \ CARIS \ BASE Editor \ 5.3 \ python \ 3.5 \ caris_py_caris.pyd 133925 ВНИМАНИЕ: lib не найдено: gdalrasteru.dll зависимость C: \ Program Files \ CARIS \ BASE Editor \ 5.3 \ python \ 3.5 \ caris_py_caris.pyd 133925 ПРЕДУПРЕЖДЕНИЕ: lib не найдена: исключительная ситуация зависимость: C: \ Program Files \ CARIS \ BASE Editor \ 5.3 \ python \ 3.5 \ caris_py_caris.pyd 133925 ВНИМАНИЕ: lib не найдена: зависимость csbsbu.dll от C: \ Program Files \ CARIS \ BASE Editor \ 5.3 \ python \ 3.5 \ caris_py_caris.pyd

Это результаты при запуске exe (пример ниже для команды выше) с --exclude-module=caris:

import search # PyInstaller PYZ
# caris not found in PYZ
# bytecode is stale for 'caris'
# code object from C:\Program Files\CARIS\BASE Editor\5.3\python\3.5\caris\__init__.py
# caris._py_caris not found in PYZ
Traceback (most recent call last):
  File "PC.py", line 19, in <module>
  File "<frozen importlib._bootstrap>", line 968, in _find_and_load
  File "<frozen importlib._bootstrap>", line 957, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "c:\program files\python35\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "search.py", line 7, in <module>
  File "<frozen importlib._bootstrap>", line 968, in _find_and_load
  File "<frozen importlib._bootstrap>", line 957, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 697, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "C:\Program Files\CARIS\BASE Editor\5.3\python\3.5\caris\__init__.py", line 15, in <module>
    from ._py_caris import *
  File "<frozen importlib._bootstrap>", line 968, in _find_and_load
  File "<frozen importlib._bootstrap>", line 957, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 577, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 938, in create_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
ImportError: DLL load failed: Impossível localizar o procedimento especificado.
[9712] Failed to execute script PC

Мои вопросы:

Почему У PYZ есть проблема с caris._py_caris? Что я делаю не так или это ошибка? caris._py_caris - это caris._py_caris.pyd Неужели это проблема для Pyinstaller? Это правильно, зачем это делать?

Надеюсь, это соответствует правилам, извините, если нет.

Спасибо за помощь.

...