Как использовать PyInstaller из скрипта, а не терминала? - PullRequest
0 голосов
/ 04 октября 2018

Короткая версия:

Как использовать PyInstaller из скрипта Python, а не из терминала?

Что мне нужно написать внутри Pythonскрипт для получения эквивалента написания этого в терминале:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Длинная версия:

Я использую библиотеку, которая требует использования PyInstaller дляраспространять исполняемый файл.Но мне нужно запустить PyInstaller один раз, затем изменить файлы спецификаций, а затем запустить файл спецификаций через PyInstaller.

Так что в терминале я бы сделал это:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

После этогоПосле запуска я вручную изменяю файл спецификации.Затем я запускаю:

>python -m PyInstaller WorkLogger.spec

Я написал скрипт, который выполняет для меня ручной труд, выполнив

>change_spec.py

Но я в конечном итоге хочу сделать все это в одном Pythonскрипт.Я хочу иметь возможность напечатать что-то вроде этого:

>distribute_python_project.py ./Worklogger

Это означает, что мой скрипт на Python должен выглядеть примерно так:

#Psuedocode:
#python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
#Code from change_spec.py
#python -m PyInstaller WorkLogger.spec

Но я не могу понять, какЯ использую PyInstaller из скрипта Python, а не из терминала.Это возможно?(Я использую библиотеку Kivy, для тех, кто заинтересован).

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете даже напрямую обращаться к модулю PyInstaller, используя файл спецификаций, если хотите.В этом примере это с различными местоположениями spec-файла, dist-dir и build-dir.

import PyInstaller

# my spec file in "dev\config" dir
workdir = os.getcwd()
fn_msi_spec = os.path.join(workdir, 'main_msi.spec')

# define the "dev\dist" and "dev\build" dirs
os.chdir("..")
devdir = os.getcwd()
distdir = os.path.join(devdir, 'dist')
builddir = os.path.join(devdir, 'build')

# call pyinstaller directly
PyInstaller.__main__.run(['--distpath', distdir, '--workpath', builddir, fn_msi_spec])
0 голосов
/ 04 октября 2018

Спасибо Сотруднику и Canh!Рабочее подтверждение концепции:

Терминал:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Сценарий Python:

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py")

При необходимости выможет запустить подпроцесс из определенного рабочего каталога :

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py", cwd=r"F:\KivyApps\WorkLogger_Dist")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...