😺

subprocess + pyinstaller --noconsole

2022/12/10に公開

PyInstallerを利用した際、subprocess関連が入っているときにうまく動作しないことがあります。
エラーメッセージすら出ないので、なかなかの困りものです。
これを回避するための策を提示します。

以下の関数を定義

def subprocess_args(include_stdout=True):
    # The following is true only on Windows.
    if hasattr(subprocess, 'STARTUPINFO'):
        info = subprocess.STARTUPINFO()
        info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        env = os.environ
    else:
        info = None
        env = None
    
    if include_stdout:
        return {'stdout': subprocess.PIPE,
                'stdin': subprocess.PIPE,
                'stderr': subprocess.PIPE,
                'startupinfo': info,
                'env': env }
    else:
        return {'stdin': subprocess.PIPE,
                'stderr': subprocess.PIPE,
                'startupinfo': info,
                'env': env}


利用の仕方

def print_pdf(pdf_path):
    '''
    PDFの印刷ダイアログを表示させる
    '''
    acrobat_path = r"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
    command = f'"{acrobat_path}" /P "{pdf_path}"'
    proc = subprocess.run(command, **subprocess_args(True))
    return proc.stdout, proc.stderr

参考

https://sapporo-president.com/archives/15581

Discussion