EXE file generated with pyinstaller crashes on start - python

I'm making a program using Python and using Pyinstaller to build the exe, but whenever I use it it crashes on launch.
I'm trying to make a program that changes the windows desktop background using Python 3.7.4.
This is the code I'm using:
def startvirus():
ctypes.windll.user32.SystemParametersInfoW(20, 0, "\aliengray.png", 0)
And this is the code I'm using to make the exe file using pyinstaller:
pyinstaller --onefile C:\Pythonfiles\compress\proto.pyw --add-data C:\Pythonfiles\compress\aliengray.png;:
I made it to change the background to aliengray.png, but it ends up just crashing on start.
It gives this error message:
:\aliengray.jpg could not be extracted!
fopen: Invalid argument

The problem must be with the location of the image .png file.
You specify a relative path, so when you run your EXE the image has to be in the same path relative to the folder of the EXE
If you want to test it, try to specify an absolute path and then create an executable.

Related

Getting folder path to script errors after compiling with pyinstaller

I am working on a small gui using Tkinter when I set the path to the icon in the script it works fine but when I run it as a exe file it says it cant be found and the path it displays is AppData\Local\Temp. What am I doing wrong?
root.iconbitmap(os.path.dirname(os.path.realpath(__file__))+"\\Icon.ico")
for pyinstaller I am using this line:
pyinstaller "Filename" --onefile
I have ran into this problem before. Don't use os.path.dirname(os.path.realpath(__file__)) to get the path the file is currently running in, but rather use sys.argv[0].
See this answer for further explanation.

Why Is pyinstaller replacing my file directory?

edit: How To Use --add-data with an entire folder?
Im converting my .py file to .exe using pyinstaller. but when i run it, it gives me this error:
Failed To Execute Script "test.py" due to unhandled exception: Couldn't open "C:\Users\Dani\AppData\Local\Temp_MEI11962\button_start.png" no such file or directory
Failed To Obtain/Convert Traceback!
Therefore My Converted Python File (exe) Was in the same directory As My Image.
My path code is built like this:
from locate import this_dir
path = this_dir()
str(path) + "\\button_start.png"
A possible solution is to use pyinstaller's --add-data argument as shown in the documentation. You can either append this to your command when building the .exe or include that in a pyinstaller.spec file.
Additional information:
When you execute a .exe, that was created with pyinstaller, it will create a temporary folder that is named _MEI<some numbers>, just as you showed above. In there, it expects all the necessary files. Therefor, this is also the place, where it will search for the image, no matter where you put your .exe to or where you execute it. Since this folder is generated temporarily every time you start the .exe, it would not help to simply copy your image there.

How can I convert pygame to exe?

Recently, I made a pygame game. I want to show it to my friends. But unfortunately, I cant make an executable file, only a .py file. I have tried to use tools such as py2exe which might not support Python 3.6 and pyinstaller. I think pyinstaller may be useful, and I can also make an exe successfully but it didn't work at all. It just showed it couldn't open the sound file which is already in the same file.
I have tried two ways to load files firstly, just load the path then the exe converted shows it can't open the file which is already in the same path with the exe.
Secondly, I use the os.path which the exe showed it cant open ...../temp/... which is a long path but my computer doesn't have this folder at all.
I am a new guy to learn python. I have searched for a day and can't make it work. Can you help me?
I'm just a scripting hack, and an idiot when it comes to command line tools. But I REALLY wanted to package up my python game into a Windows executable. I wrestled with pyinstaller for days, and read all of the threads of others who are also trying to figure it out, and I also read all the pyinstaller docs several times. No one solution worked for me, but after much trial and error I finally stumbled onto a recipe for success and want to share it in case there are other pygame developers out there banging their heads against this. The solution contains bits and pieces of several threads.
How to create a single file exe of a multi-file python pygame with several asset directories using pyinstaller on Windows:
First, install pyinstaller.
Open Windows Command Prompt, type:
pip install pyinstaller
Make a python game. Say the main game file is called main_game_script.py, located in
C:\Users\USERNAME\Documents\python\game_dir
Add this function to main_game_script.py. Make sure to import os and sys. (I never would have figured out on my own that I needed to add this function to my game, but it works, so thanks to whoever posted it in some other thread)
import sys
import os
def resource_path(relative_path):
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)
To load images into game, call that function, like such:
asset_url = resource_path('assets/chars/hero.png')
hero_asset = pygame.image.load(asset_url)
When your game is ready to be wrapped in an EXE, open Windows Command Prompt. Go to the main game directory and type:
pyinstaller --onefile main_game_script.py --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts
It'll look like this:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller --onefile main_game_script.py --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts
This will create four important items:
- a main_game_script.spec file in the game_dir
- a 'build' dir in the game_dir
- a 'dist' directory in the game_dir
- a main_game_script.exe will be created in the 'dist' directory.
Running the command spits out a ton of warnings and logs. I don't know what it all means. But as long as the final output line says success, you're probably good.
If your exe is still not working: First, you must modify the .spec file (which now exists in the game_dir) to add the needed game asset paths to the exe:
Open the main_game_script.spec file in notepad or whatever.
Replace the empty datas[] list with asset directory paths like such (using tuples!):
datas=[('assets/chars/*','assets/chars'),('assets/tiles/*.png','assets/tiles'),('assets/fonts/*','assets/fonts')],
The first value of each tuple is the actual file names you want to import.
The second value is the relative path from you main_game_script.py
The syntax and paths must be perfect, or it won't work and may not throw an error
Save and close the 'main_game_script.spec' file. Return to your windows command prompt. Type:
pyinstaller main_game_script.spec
Like this:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller main_game_script.spec
This somehow embeds the asset dir paths into the exe that you've already built
After all this (which only takes a couple minutes after you've done it 100 times), you finally have a single file EXE of your python game that includes all of the game assets. If you've done everything right, double click on the EXE to play your python game.
Note: getting it right the first time took me a couple days. I started with a simple test_game_script.py with minimal code and iterated methodically, adding more asset paths and complexity with each iteration so I could isolate what was broken and why. If your game isn't converting to EXE properly, start with a simple 5 line game script with one asset and slowly build on it until you have a pipeline that works, THEN apply that functioning asset pipeline your ACTUAL game. Otherwise isolating the problem will be impossible.
1. Add --hidden-import pygame.
Something like:
python -m PyInstaller <options> xxx.py --hidden-import pygame
2. Hack the pygame stdout.
If you used the option -w, it will fail because of the (annoying) version output of pygame.
Workaround:
import contextlib
with contextlib.redirect_stdout(None):
import pygame
I too had the same problem and spent days looking through google. Today finally I realised what was the problem.
Before trying to convert it, remember to install Pygame via the Terminal as well. Just type in "pip install pygame"
This can be done with cx_freeze
pip install cx_freeze
You will need to create a setup.py file to help cx_freeze build the executable
import cx_Freeze
# base = "Win32GUI" allows your application to open without a console window
executables = [cx_Freeze.Executable('my_example_app.py', base = "Win32GUI")]
cx_Freeze.setup(
name = "My Example Exe App",
options = {"build_exe" :
{"packages" : ["pygame"], "include_files" : ['example_folder_with_files/', 'ExampleFont.ttf', 'example_text_file.txt']}},
executables = executables
)
Be sure to add your packages, fonts, or files to the script and any additional files that your app needs to the setup.
Finally you need to run your setup.py script
python setup.py build
or if you want cx_freeze to create an installer for you
python setup.py bdist_msi
Sentdex has a nice walkthrough on his website
pythonprogramming.net
#Blue Botic answer above works like a charm! Thank you!
I added the "--noconsole" parameter in the below command to get rid of the console and only show the game's main window:
pyinstaller --onefile --noconsole main_game_script.py
With PyInstaller it's possible without editing the .spech file, using the argument --collect-data NAME_ASSET_FOLDER
pyinstaller main_game_script.py --onefile --windowed --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts

Pyinstaller exe single file executable on different computer

I am trying to make a gui to control a spectrum analyzer. The code works when running from the IDE. I generate an .exe unsing pyinstaller with the code.pyinstaller.exe --onefile --windowed --icon=spec.ico spectrum_analyzer_gui.py The .exe works great on the computer that generated it.
I tried to run the .exe on a different computer but got an error 'Failed to execute script spectrum_analyzer_gui'
I copied the icon to the same location.
What else do I need to do so the application runs on a different machine?
I have attached a like to a .zip in dropbox with the source code and build.
https://www.dropbox.com/s/87uqynllnlv72c4/Spectrum%20Analyzer%20Gui.zip?dl=0
Try adding a --hidden-import=tkinter to your exe generation.

Converting a Pygame Game into an Exe [duplicate]

Recently, I made a pygame game. I want to show it to my friends. But unfortunately, I cant make an executable file, only a .py file. I have tried to use tools such as py2exe which might not support Python 3.6 and pyinstaller. I think pyinstaller may be useful, and I can also make an exe successfully but it didn't work at all. It just showed it couldn't open the sound file which is already in the same file.
I have tried two ways to load files firstly, just load the path then the exe converted shows it can't open the file which is already in the same path with the exe.
Secondly, I use the os.path which the exe showed it cant open ...../temp/... which is a long path but my computer doesn't have this folder at all.
I am a new guy to learn python. I have searched for a day and can't make it work. Can you help me?
I'm just a scripting hack, and an idiot when it comes to command line tools. But I REALLY wanted to package up my python game into a Windows executable. I wrestled with pyinstaller for days, and read all of the threads of others who are also trying to figure it out, and I also read all the pyinstaller docs several times. No one solution worked for me, but after much trial and error I finally stumbled onto a recipe for success and want to share it in case there are other pygame developers out there banging their heads against this. The solution contains bits and pieces of several threads.
How to create a single file exe of a multi-file python pygame with several asset directories using pyinstaller on Windows:
First, install pyinstaller.
Open Windows Command Prompt, type:
pip install pyinstaller
Make a python game. Say the main game file is called main_game_script.py, located in
C:\Users\USERNAME\Documents\python\game_dir
Add this function to main_game_script.py. Make sure to import os and sys. (I never would have figured out on my own that I needed to add this function to my game, but it works, so thanks to whoever posted it in some other thread)
import sys
import os
def resource_path(relative_path):
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)
To load images into game, call that function, like such:
asset_url = resource_path('assets/chars/hero.png')
hero_asset = pygame.image.load(asset_url)
When your game is ready to be wrapped in an EXE, open Windows Command Prompt. Go to the main game directory and type:
pyinstaller --onefile main_game_script.py --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts
It'll look like this:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller --onefile main_game_script.py --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts
This will create four important items:
- a main_game_script.spec file in the game_dir
- a 'build' dir in the game_dir
- a 'dist' directory in the game_dir
- a main_game_script.exe will be created in the 'dist' directory.
Running the command spits out a ton of warnings and logs. I don't know what it all means. But as long as the final output line says success, you're probably good.
If your exe is still not working: First, you must modify the .spec file (which now exists in the game_dir) to add the needed game asset paths to the exe:
Open the main_game_script.spec file in notepad or whatever.
Replace the empty datas[] list with asset directory paths like such (using tuples!):
datas=[('assets/chars/*','assets/chars'),('assets/tiles/*.png','assets/tiles'),('assets/fonts/*','assets/fonts')],
The first value of each tuple is the actual file names you want to import.
The second value is the relative path from you main_game_script.py
The syntax and paths must be perfect, or it won't work and may not throw an error
Save and close the 'main_game_script.spec' file. Return to your windows command prompt. Type:
pyinstaller main_game_script.spec
Like this:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller main_game_script.spec
This somehow embeds the asset dir paths into the exe that you've already built
After all this (which only takes a couple minutes after you've done it 100 times), you finally have a single file EXE of your python game that includes all of the game assets. If you've done everything right, double click on the EXE to play your python game.
Note: getting it right the first time took me a couple days. I started with a simple test_game_script.py with minimal code and iterated methodically, adding more asset paths and complexity with each iteration so I could isolate what was broken and why. If your game isn't converting to EXE properly, start with a simple 5 line game script with one asset and slowly build on it until you have a pipeline that works, THEN apply that functioning asset pipeline your ACTUAL game. Otherwise isolating the problem will be impossible.
1. Add --hidden-import pygame.
Something like:
python -m PyInstaller <options> xxx.py --hidden-import pygame
2. Hack the pygame stdout.
If you used the option -w, it will fail because of the (annoying) version output of pygame.
Workaround:
import contextlib
with contextlib.redirect_stdout(None):
import pygame
I too had the same problem and spent days looking through google. Today finally I realised what was the problem.
Before trying to convert it, remember to install Pygame via the Terminal as well. Just type in "pip install pygame"
This can be done with cx_freeze
pip install cx_freeze
You will need to create a setup.py file to help cx_freeze build the executable
import cx_Freeze
# base = "Win32GUI" allows your application to open without a console window
executables = [cx_Freeze.Executable('my_example_app.py', base = "Win32GUI")]
cx_Freeze.setup(
name = "My Example Exe App",
options = {"build_exe" :
{"packages" : ["pygame"], "include_files" : ['example_folder_with_files/', 'ExampleFont.ttf', 'example_text_file.txt']}},
executables = executables
)
Be sure to add your packages, fonts, or files to the script and any additional files that your app needs to the setup.
Finally you need to run your setup.py script
python setup.py build
or if you want cx_freeze to create an installer for you
python setup.py bdist_msi
Sentdex has a nice walkthrough on his website
pythonprogramming.net
#Blue Botic answer above works like a charm! Thank you!
I added the "--noconsole" parameter in the below command to get rid of the console and only show the game's main window:
pyinstaller --onefile --noconsole main_game_script.py
With PyInstaller it's possible without editing the .spech file, using the argument --collect-data NAME_ASSET_FOLDER
pyinstaller main_game_script.py --onefile --windowed --collect-data assets/chars --collect-data assets/tiles --collect-data assets/fonts

Categories

Resources