Я создал программу в 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? Это правильно, зачем это делать?
Надеюсь, это соответствует правилам, извините, если нет.
Спасибо за помощь.