【问题标题】:.app made using PyInstaller closes straight away?使用 PyInstaller 制作的 .app 会立即关闭吗?
【发布时间】:2018-07-15 00:44:59
【问题描述】:

我尝试使用 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("")

规格文件:

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

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

【问题讨论】:

  • @MitaleeRao 你指的是同一个页面

标签: python pyinstaller


【解决方案1】:

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

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

【讨论】:

  • 当我使用您的路径 (/path/to/app/dist/MyApp.app/Contents/MacOS/MyApp) 从终端打开我的应用程序时,我的应用程序在终端内完美运行。
  • 只是为了确保我理解这个问题 - 当您从终端运行 .app 时,它可以正常工作(它不会立即关闭并且不会产生错误消息)。当您尝试通过双击 .app 文件来运行 .app 时,它将短暂打开然后关闭。这是正确的吗?
  • @CoopDaddio 我更仔细地检查了你的 .spec 文件,我相信我的答案的更新可能会解决你的问题。
  • 我只能使用您提供的地址从终端运行 .app。我尝试以任何其他方式运行 .app 它会短暂打开然后关闭,是的。
  • 您最初是如何生成 .spec 文件的?我建议删除(或移动)您的 .spec 文件,删除(或移动)build/ 和 dist/ 目录,然后运行以下命令生成 .app 文件:pyinstaller --onefile --console --add-data 'postcodes.txt:.', algorithmPOSTCODE.py
【解决方案2】:

我遇到了和你一样的问题,尽管我知道我的代码不应该立即关闭,因为它等待 user_input。当我使用python my_script.py 从终端运行我的代码时,程序会运行良好。

这是我修复它的方法:

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

pip install pyinstaller

我认为这是我的主要工作,因为我第一次安装它时,我相信我的防病毒软件阻止了一些组件正确安装,当我重新安装它时,它可能修补了漏洞。

我还尝试了不同的命令行命令。我明确声明让最终的 .exe 打开控制台并使用 -c 标志保持打开状态。 注意:在 Windows 上,如果第一个脚本是“.pyw”文件,则此选项无效。 它看起来像这样:

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

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

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

希望这会有所帮助!

【讨论】:

  • 我试过了,但打印结果后屏幕仍然消失.. 应该怎么做才能显示结果更长时间?
  • 不幸的是,添加 -c 并没有改变我的情况
  • 你有什么杀毒软件?
【解决方案3】:

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

更新

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

【讨论】:

    【解决方案4】:

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

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

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

    要解决此问题,请使用以下 sn-p:

    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 将正确找到该位置,并且您每次打开程序时都可以引用相同的文件。我的程序现在也可以通过双击应用程序按预期打开。

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

    【讨论】:

    • 我的 .spec 文件中是否包含上述行?有什么特别的位置吗?我试图插入它们,但Current_Path = str(os.path.dirname(__file__)) 抛出了一条错误消息。
    【解决方案5】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2021-11-02
      • 2012-08-06
      • 2020-12-27
      相关资源
      最近更新 更多