web-dev-qa-db-ja.com

Python:Pyinstaller.specファイルで出力フォルダーを指定する方法

python 3.5およびpyinstallerバージョン3.1.1を使用しています。SCADAsync_spec.specという.specファイルを次のように指定しました。

block_cipher = None

a = Analysis(['SCADAsync.py'],
             pathex=['C:\\repo\\analysis\\trunk\\source\\python\\functions', 'C:\\repo\\analysis\\trunk\\source\\python\\Executables'],
             binaries=None,
             datas=[('figs\\ROMO_icon.ico','figs'),('figs\\OpenFile2.gif','figs'),('figs\\ROMOWind_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

これで、2つの大きなフォルダー(distとbuild)が作成され、デフォルトのディレクトリ以外の場所に保存したいと思います。スペックファイルでこれらのフォルダの場所を設定する方法を知っている人はいますか?コマンドラインコマンドをできるだけシンプルにしたいと思います。つまり、.exeは入力するだけでビルドできます。

pyinstaller SCADAsync_spec.spec

Pyinstallerのマニュアルから、スペックファイル( https://pythonhosted.org/PyInstaller/spec-files.html )に「DISTPATH」および「workpath」というグローバルを指定できるようです。しかし、私はそれを行う方法を本当に理解することはできません。

どんな助けでも大歓迎です!

ニック

10
Nickj

JonasGrögerが指摘したように、あなたは確かに次のことができます。

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

# ... rest of spec file

ただし、構成モジュールのドキュメントには、限られた数の変数でのみ機能すると記載されています。

このモジュールは、実行時のPyInstaller構成を保持します。

変数CONFは、ビルドフェーズに必要なすべての構成オプションを備えたdict()です。ビルドフェーズは、.specファイルをexec()関数に渡すことによって実行されます。 CONF変数は、exec()に引数を渡す方法と、「グローバル」変数の使用を回避する唯一の方法です。

注:「グローバル」変数を使用すると、テスト用の分離された環境が提供されないため、テストスイートではうまく機能しません。この場合、一部のテストが失敗する可能性があります。

注:「CONF」dict()は、他の可能なテストに干渉しないように、ビルドフェーズの後にクリーンアップされます。

ビルドフェーズに引数を渡すには、次のようにします。

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

ワークパス

大文字で「DISTPATH」を使用すると、トリックは機能しません(Pyinstaller3.3.1およびpython 2.7.13))が、小文字に設定すると、次のようになります。

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

# ... rest of spec file

それはうまくいくでしょう... :)

4
TocToc

Pyinstallerのspec/build/distロケーションパスは、pyinstallerコマンドの一部として構成できます。以下の例を参照してください

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