使用PyInstaller制作的.app立即关闭?

Coo*_*dio 3 python pyinstaller

我试图使用PyInstaller将python程序转换为.app。实际的代码可以通过IDLE正常运行,但是每次我尝试运行新转换的.app时,它都会立即关闭。以下是我的.spec文件和.py文件。我已经编辑了.spec文件,并在导入的.py文件中添加了文本文件。

PYTHON文件:

#CENTRALCOAST: 2250-2420
#CENTRALCOAST2: 2250-2267
#NORTHERNBEACHES: 2084-2108
CentralCoast = []
NorthernBeaches = []
OOR = []
Invalid = []
import math
def numLen(num):
  return len(str(abs(num)))

with open('postcodes.txt') as input_file:
    long_list = [line.strip() for line in input_file]
    for i in range(len(long_list)):
        long_list[i] = int(long_list[i])
for each in long_list:
    if 2084 <= each <= 2108: #NorthernBeaches
        NorthernBeaches.extend([each])
for each in long_list:
    if 2250 <= each <= 2267: #CentralCoast
        CentralCoast.extend([each])
for each in long_list:
    if not 2250 <= each <= 2267:
        OOR.extend([each])
#for each in long_list:
#    if numLen(each) != 4:
#        Invalid.extend([each])

Total = len(CentralCoast) + len(OOR) + len(NorthernBeaches) + len(Invalid)

print("Central Coast:", len(CentralCoast), "------", round(len(CentralCoast)/Total,2), "%")
print("")
print("Northern Beaches:", len(NorthernBeaches), "------", round(len(NorthernBeaches)/Total,4), "%")
print("")
print("Out of Range:", len(OOR), "------", round(len(OOR)/Total,2), "%")
print("")
#i = 0
#for i in OOR:
#  print(i)
#  i = i + 1
print("Invalid Entry:", len(Invalid), "------", round(len(Invalid)/Total,4), "%")
print("")
print("")
print("Total:", Total)
exit = input("")
Run Code Online (Sandbox Code Playgroud)

规格文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['algorithmPOSTCODE.py'],
             pathex=['/Users/CooperTimewell'],
             binaries=[],
             datas=[('postcodes.txt', '.')],
             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,
          exclude_binaries=True,
          name='algorithmPOSTCODE',
          debug=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='algorithmPOSTCODE')
app = BUNDLE(coll,
             name='algorithmPOSTCODE.app',
             icon=None,
             bundle_identifier=None)
Run Code Online (Sandbox Code Playgroud)

如何阻止它立即关闭?谢谢。

Mat*_*Dnv 9

也许尝试从 windows >execute >cmd windows 启动可执行文件,而不是双击可执行文件(我想你正在使用 windows)

更新

如果有任何错误导致您的应用程序过早关闭,此方法将清楚地显示出来


Jos*_*Hew 6

即使您知道我的代码由于等待user_input而不会立即关闭,我也遇到了与您相同的问题。当我从终端使用python my_script.py程序运行代码时,它将运行良好。

这是我的解决方法:

我使用以下方法重新安装了pyinstaller:

pip install pyinstaller
Run Code Online (Sandbox Code Playgroud)

我认为这是我的主要任务,因为我第一次安装它时,我相信我的防病毒软件阻止了某些组件的正确安装,当我重新安装它时,它可能会在孔中打补丁。

我还尝试了其他命令行命令。我明确声明要为最终的.exe打开控制台,并使用该-c标志使其保持打开状态。它看起来像这样:

pyinstaller -c -F -i cm_icon.ico console_monopoly.py 
Run Code Online (Sandbox Code Playgroud)

-F标志是将所有内容捆绑到一个.exe中,而不是在dist /文件夹中有很多围绕我的.exe的文件。

-i标志用于向程序添加图标。

希望这可以帮助!


Anc*_*bro 5

经过几个小时的冲刷/修补,我想我已经找到了解决方案!

我也遇到了同样的问题。这是由 Pyinstaller 构建定义的,该构建在 Windows 和 Linux 上运行良好,但在 Mac 上构建后立即关闭。和您一样,Mac 构建应用程序在打开后关闭,但如果您浏览应用程序文件夹并直接打开 Unix 可执行文件,它可以完美运行。你的规格文件对我来说看起来很完美。

对我来说,我将问题追溯到我的程序必须将文件写入磁盘,无论是创建日志文件还是创建架子文件(我用于保存日期)。当您运行 pyinstaller 构建时,Mac 会在随机临时文件夹中执行所有运行时操作。由于某种原因,Mac 在从 unix 可执行文件运行时可以找到正确的运行时临时文件夹,但在从应用程序运行时会丢失。您可以使用 _meipass 将日志/架子文件(或其他文件)引导到正确的临时文件夹,但这会导致其他问题。一些较新的 Mac 没有在那里写入的权限,而且每次打开程序时都会得到一个新的临时文件夹,这使得它对于日志或保存毫无用处。

要解决此问题,请使用以下代码片段:

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

然后将其相应地连接到您的日志/架子/保存文件名:

shelfFile = shelve.open(os.path.join(Current_Path, 'example_data'))
Run Code Online (Sandbox Code Playgroud)

此解决方案将使任何创建的文件直接放在 Mac 应用程序包中的 Unix 可执行文件旁边,而不是放在随机临时文件中。Mac 会正确找到该位置,并且您每次打开程序时都可以引用相同的文件。我的程序现在也可以通过按预期双击应用程序来打开。

几个月来我一直在努力解决这个问题。希望其他人发现这很有用。


Gan*_*ula 5

解决此问题的最简单方法是在代码执行完成之前在代码末尾添加输入。

input("Press enter to proceed...")
Run Code Online (Sandbox Code Playgroud)

我找到的答案都不能提供类似的功能

此外,这对我的帮助是,如果用户直接按 Enter 键,我会关闭当前实例并立即弹出应用程序的新实例。如果用户在之前的输入中意外输入了错误的值,这会很有帮助。
如果用户输入任何其他值,该过程将停止,而不创建新实例。


apo*_*con 2

在您的情况下,因为您在 .spec 文件中设置了console标志False,所以不会显示控制台窗口,从而阻止显示程序的输出。将此标志更改为True.

应用程序也可能因为无法导入包或查找外部文件而关闭,从而阻止您的应用程序启动。要查看与运行可执行文件相关的错误消息,请从终端(或命令提示符)运行 .app(或 .exe)文件:/path/to/app/dist/MyApp.app/Contents/MacOS/MyApp对于 Mac(在终端中),/path/to/app/dist/MyApp.exe对于 Windows(在命令提示符中)。这将使您能够观察应用程序捆绑后可能存在的任何错误。如果程序在导入语句期间失败,您可能需要将包添加到hiddenimports.spec 文件的列表中。