.app made using PyInstaller closes straight away?

前端 未结 4 1335
[愿得一人]
[愿得一人] 2021-02-09 03:47

I have attempted to convert my python program into a .app using PyInstaller. The actual code runs fine through IDLE, but everytime I try and run the newly converted .app, it clo

相关标签:
4条回答
  • 2021-02-09 03:58

    In your case, because you set the console flag to False in your .spec file, the console window will not be displayed, preventing the output of your program from being displayed. Change this flag to True.

    It is also possible that the application may be closing because it is unable to import a package or find an external file, which prevents your application from launching. To view the error messages associated with running your executable, run the .app (or .exe) file from the terminal (or command prompt): /path/to/app/dist/MyApp.app/Contents/MacOS/MyApp for Mac (in Terminal), /path/to/app/dist/MyApp.exe for Windows (in Command Prompt). This will allow you to observe any errors that may exist after the app was bundled. If the program does fail during an import statement, you may need to add a package to the hiddenimports list in the .spec file.

    0 讨论(0)
  • 2021-02-09 04:04

    Maybe try to launch the executable from the windows >execute >cmd windows instead of double clicking on the executable (I suppose you are using windows)

    UPDATE

    This method will show it clearly if there is any error causing your application to closes prematurely

    0 讨论(0)
  • 2021-02-09 04:07

    I had the same problem as you even though I knew my code wasn't supposed to close immediately since it waited for user_input. When I ran my code from the terminal using python my_script.py the program would run fine.

    Here is how I fixed it:

    I reinstalled pyinstaller using:

    pip install pyinstaller
    

    I think that this was my main thing because the first time I installed it, I believe my antivirus prevented some of the components from installing correctly and when I reinstalled it, it probably patched in the holes.

    I also tried a different command-line command. I explicitly stated for the final .exe to open a console and keep it open using the -c flag. Note: On Windows, this option will have no effect if the first script is a ‘.pyw’ file. It looked like this:

    pyinstaller -c -F -i cm_icon.ico console_monopoly.py 
    

    the -F flag was to bundle everything into one .exe instead of having a lot of files surrounding my .exe in the dist/ folder.

    the -i flag is for adding an icon to my program.

    Hope this helps!

    0 讨论(0)
  • 2021-02-09 04:13

    After many hours scouring/tinkering, I think I have found a solution!!

    I have been having the same issue. This is defined by a Pyinstaller build that works fine on Windows and Linux, but closes immediately after building on Mac. Like you, the Mac build app closes after opening, but if you navigate through the app folder and open the Unix Executable directly it runs flawlessly. Your spec file looks perfect to me.

    For me I traced the issue down to my program having to write files to the disk, whether it be creating a log file, or creating a shelf file (which I use for save date). When you run a pyinstaller build Macs will do all their run-time things in a random temp folder. For some reason Macs can find their way to the correct run-time temp folder when run from the unix executable, but get lost when run from the app. You COULD use _meipass to guide your log/shelf file (or whatever) to the correct temp folder, but this causes other problems. Some newer macs don't have permission to write there, and additionally you get a new temp folder every time you open the program, making it useless for logs or saves.

    To resolve this issue use the following snippet:

    import sys
    import os
    if getattr(sys, 'frozen', False):
        Current_Path = os.path.dirname(sys.executable)
    else:
        Current_Path = str(os.path.dirname(__file__))
    

    And then connect it to your log/shelf/save file names accordingly:

    shelfFile = shelve.open(os.path.join(Current_Path, 'example_data'))
    

    This solution will make any created file drop right next to your Unix Executable in the Mac app bundle, and NOT in the random temp file. Macs will find the location properly, and you will be able to reference the same file every time you open the program. My program also now opens from double clicking the app as intended.

    I've been coming back and trying to solve this problem for MONTHS. Hopefully someone else finds this useful.

    0 讨论(0)
提交回复
热议问题