I want to execute an exe file from a python file that is compiled using pyinstaller
I’m using the following code:
import subprocess, os, sys def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) new_path = resource_path("executable.exe") print new_path subprocess.Popen(new_path)
And I compile it using:
pyinstaller --add-binary executable.exe;exe -F incluse.py
Which creates incluse.exe and If I execute it I get the following error:
C:UsersMyUsernameAppDataLocalTemp_MEI13~1executable.exe Traceback (most recent call last): File "incluse.py", line 16, in <module> File "subprocess.py", line 394, in __init__ File "subprocess.py", line 644, in _execute_child WindowsError: [Error 2] The system cannot find the file specified [21812] Failed to execute script incluse
What I want it to do is execute the executable.exe that I included, which should come up with a message box.
Advertisement
Answer
You can bundle another binary into your exe with pyinstaller using the --add-binary
option.
In your Python script you can then call the exe embedded within your exe by using subprocess.Popen(exe_path)
. You can use sys._MEIPASS
to access the temporary location that the exe will be found at in order to build the path to the exe.
Example
putty_launcher.py
import os import sys import subprocess if getattr(sys, 'frozen', False): base_path = sys._MEIPASS else: base_path = "" exe_path = os.path.join(base_path, 'binariesputty.exe') subprocess.Popen(exe_path)
Folder Structure
root ├── binaries │ └── putty.exe ├── putty_launcher.py
In the root folder, execute:
pyinstaller --add-binary "binariesputty.exe;binaries" --onefile putty_launcher.py
This will then build an exe from the putty_launcher.py script which can successfully call the version of putty.exe that is embedded within the exe.