Я пытаюсь создать исполняемый файл в Windows 10 Pro из сценария Python, который использует импорт
# main.py
from termcolor import cprint
def main() -> None:
cprint('Hello', 'red')
if __name__ == '__main__':
main()
Я установил поэзию и создал среду
poetry new test
добавлен термоцвет
poetry add termcolor
Если я войду в поэтическую оболочку и запущу скрипт
python main.py
он работает так, как ожидалось.
Когда я создаю exe
pyinstaller --onefile main.py
и попробуйте запустить exe, который генерирует ModuleNotFoundError для termcolor
Это мой файл main.spec
a = Analysis(
['main.py'],
pathex=['.', 'C:\Users\... path to ...\site-packages'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig = {},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='main',
)
Что я делаю не так?
это также может быть вам полезно: stackoverflow.com/questions/25733467/…
@iBeMeltin Этот вопрос сбивает с толку - скрытый импорт не помогает
Посмотрите на ответ HBK. Это также включает в себя поэтический модуль.
@iBeMeltin Спасибо. Мне нравится дисциплина envs. Это мой первый опыт работы с Windows, и я не хочу, чтобы мой глобальный Python был загрязнен множеством (возможно, конфликтующих) дополнительных модулей. Я исследую дальше. Теперь я понимаю, почему поэзия может быть проблемой.
Я решил эту проблему на основе этого ответа. Я подробно описываю свое решение в надежде, что оно может помочь кому-то в будущем.
Поскольку мы используем поэзию для управления средой, нам нужно запустить pyinstaller как скрипт, определенный в разделе pyproject.tomltool.poetry.scripts (см. ниже). Это не сработает, если вы вызовете его прямо из командной строки.
Создать новый проект
poetry new xyz
в каталоге проектов, и он создает
.
└─projects
└─xyz
├── xyz
│ └── __init__.py
├─── tests
│ └── __init__.py
├── pyproject.toml
└── README.md
В нижнем из двух каталогов xyz создайте main.py и pyinstaller.py.
# xyz/xyz/pyinstaller.py
import PyInstaller.__main__
from pathlib import Path
HERE = Path(__file__).parent.absolute()
path_to_main = str(HERE / "main.py")
def install():
PyInstaller.__main__.run([
path_to_main,
'--onefile',
'--windowed',
# other pyinstaller options...
])
В файл pyproject.toml добавьте строки
[tool.poetry.scripts]
build = "xyz.pyinstaller:install"
Введите каталог нового проекта
cd xyz
Затем войдите в оболочку поэзии
poetry shell
и добавьте PyInstaller
poetry add PyInstaller
Добавьте любые другие зависимости
poetry add <dependencies ...>
Создайте приложение
poetry run build
(Предупреждаем, что вы можете получить предупреждение о вирусе — в этом случае исключите папку xyz из системы безопасности Windows)
вы можете попробовать добавить termcolor к скрытому импорту в вашем файле спецификации.