Как устранить ошибку "не найден модуль Pyinstaller" - PullRequest
2 голосов
/ 07 августа 2020

Я пытаюсь использовать Pyinstaller для упаковки моего проекта в исполняемый файл. В настоящее время я делаю это на своем P C на базе Ubuntu для подтверждения концепции, после чего планирую перейти на Windows, чтобы создать .exe, который можно запустить на windows. Проблема в том, что после создания исполняемого файла и его запуска он не может найти один из локальных пакетов, которые были импортированы в файл запуска. Это структура моего проекта:

.
├── hook-streamlit.py
├── __init__.py
├── models
│   ├── __init__.py
│   ├── loader.py
│   ├── nn.py
│   └── runner.py
├── notebooks
├── README.md
├── requirements.txt
├── stapp
│   ├── __init__.py
│   ├── main.py
│   └── session_state.py
├── startup.py
├── startup.spec
├── test_data
│   ├── test_x.csv
│   ├── test_y.csv
│   ├── train_x.csv
│   └── train_y.csv
├── tkapp.py
├── unipredictor-icon.ico
├── UniPredictor.spec
└── utils.py

startup.py - это сценарий запуска, и вот его содержимое:

import os
import subprocess
import shlex

from models import nn, loader, runner
from stapp import main

subprocess.call(shlex.split(f"streamlit run {os.path.join('stapp', 'main.py')} --global.developmentMode=false"))

Хотя мне не нужны models и stapp пакетов в сценарии запуска, я импортирую их, чтобы убедиться, что pyinstaller разрешает зависимости, поскольку я использую подпроцесс для запуска приложения. Но даже с этим я все равно получаю ModuleNotFoundError: No module named 'models' после сборки и запуска исполняемого файла. Эта ошибка возникает из stapp.main, где models импортировано. Я безуспешно пытался добавить models и stapp в hiddenimports. Я бы подумал, что поскольку проект root добавлен в PYTHONPATH, у него не должно быть проблем с локальными пакетами. И даже если по какой-то причине это произошло, импорт и скрытый импорт должны с этим справиться. Вот мой текущий файл spe c:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['startup.py'],
             pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
             binaries=[],
             datas=[],
             hiddenimports=['models', 'stapp'],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=['torch.distributions'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='startup',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='unipredictor-icon.ico')

Я буду признателен за любую помощь в том, как заставить pyinstaller включать локальные пакеты проекта. Спасибо!

Ответы [ 2 ]

1 голос
/ 12 августа 2020

Я решил проблему, загрузив необходимые пакеты и модули в виде данных.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['startup.py'],
             pathex=['/home/kenneth/PycharmProjects/universal_predictor'],
             binaries=[],
              datas=[('.streamlit', '.streamlit'), ('.data', '.data'), ('models', 'models'), ('stapp', 'stapp'), ('utils.py', '.')],
             hiddenimports=[],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=['torch.distributions'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='startup',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='unipredictor-icon.ico')
0 голосов
/ 12 августа 2020

Проблема именно в том, что показывают. Вам необходимо расширить PYTHONPATH для моделей. В вашем файле spe c также добавьте путь к пакету для моделей.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['startup.py'],
             pathex=['/home/kenneth/PycharmProjects/universal_predictor', 
'/home/kenneth/PycharmProjects/universal_predictor/models'],
             binaries=[],
             datas=[],
             hiddenimports=['models', 'stapp'],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=['torch.distributions'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='startup',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='unipredictor-icon.ico')
...