使用PyInstaller制作的.app直接关闭?

时间:2018-02-05 07:45:36

标签: 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("")

SPEC FILE:

# -*- 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)

如何阻止它立即关闭?三江源。

5 个答案:

答案 0 :(得分:4)

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

更新

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

答案 1 :(得分:3)

我遇到了与你相同的问题,即使我知道我的代码不应该立即关闭,因为它等待user_input。当我使用python my_script.py从终端运行我的代码时,程序运行正常。

以下是我修复它的方法:

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

pip install pyinstaller

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

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

pyinstaller -c -F -i cm_icon.ico console_monopoly.py 
-F标志是将everthing捆绑到一个.exe中,而不是在dist /文件夹中包含很多文件。

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

希望这有帮助!

答案 2 :(得分:2)

经过数小时的搜索/修补后,我想我已经找到了解决方法!

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

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

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

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

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

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

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

我一直在努力解决MONTHS的这个问题。希望其他人会觉得有用。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

input("Press enter to proceed...")

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

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