Python: как указать выходные папки в Pyinstaller.Spec-файл

Я использую python 3.5 и pyinstaller версии 3.1.1. Я указал a .файл спецификации, называемый SCADAsync_spec.спецификации следующим образом:

block_cipher = None

a = Analysis(['SCADAsync.py'],
             pathex=['C:repoanalysistrunksourcepythonfunctions', 'C:repoanalysistrunksourcepythonExecutables'],
             binaries=None,
             datas=[('figsROMO_icon.ico','figs'),('figsOpenFile2.gif','figs'),('figsROMOWind_Logo2015_CMYK.png','figs')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='SCADAsync',
          debug=True,
          strip=False,
          upx=True,
          console=True
       )

это отлично работает при выполнении с

pyinstaller SCADAsync_spec.spec

Теперь это создает две большие папки (dist и build) , которые я предпочел бы хранить в другом месте, чем в каталоге по умолчанию. Кто-нибудь знает, как установить местоположение этих папок в файле спецификации? Я хотел бы сохранить команду командной строки как можно более простой, т. е. этот.exe должен строить, просто набрав

pyinstaller SCADAsync_spec.spec

из руководства Pyinstaller кажется, что я могу указать глобалы под названием "DISTPATH" и "workpath" в файл spec (https://pythonhosted.org/PyInstaller/spec-files.html). Но я не могу понять, как это сделать.

любая помощь была бы очень признательна!

Ник

2 ответов


как указал Йонас Грегер, вы действительно можете сделать:

import PyInstaller.config
PyInstaller.config.CONF['workpath'] = "./my_build_directory"

# ... rest of spec file

однако документация в модуле config говорит, что он работает только на ограниченном количестве переменных:

этот модуль содержит конфигурацию PyInstaller во время выполнения.

Variable CONF-это dict() со всеми необходимыми параметрами конфигурации для этапа сборки. Этап сборки выполняется путем прохождения .файл спецификаций для запуска() функция. Переменная CONF-единственный способ передачи аргументы для exec () и как избежать использования глобальных переменных.

Примечание: наличие "глобальных" переменных плохо сочетается с набором тестов потому что он не обеспечивает изолированные среды для испытаний. Некоторые тесты могут не в этом случае.

Примечание: дикт "конф" () очищен после участка здания для того чтобы не помешать с любой другой возможный тест.

чтобы передать любые аргументы для построения фазы, просто сделайте:

from PyInstaller.config import CONF
CONF['my_var_name'] = my_value

и использовать это переменная на этапе сборки:

from PyInstaller.config import CONF
foo = CONF['my_var_name']

Это список известных переменных. (При необходимости обновите его.)

cachedir

hasUPX

hiddenimports

noconfirm

pathex

ui_admin

ui_access

upx_dir

workpath

если вы используете "DISTPATH" в столице трюк не будет работать (Pyinstaller 3.3.1 и python 2.7.13) но если вы установите нижний регистр:

import PyInstaller.config
PyInstaller.config.CONF['distpath'] = "./my_app_directory"

# ... rest of spec file

это сработает... :)


Pyinstaller spec/build / dist пути расположения могут быть настроены как часть команды pyinstaller. См. ниже пример

pyinstaller --specpath /opt/bk/spec --distpath /opt/bk/dist --workpath /opt/bk/build testscript.py