Я пытаюсь использовать 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 включать локальные пакеты проекта. Спасибо!