导出单个 .exe 时,PyInstaller 卡在“正在构建 PKG ...”

Posted

技术标签:

【中文标题】导出单个 .exe 时,PyInstaller 卡在“正在构建 PKG ...”【英文标题】:PyInstaller stuck on "Building PKG ..." when exporting a single .exe 【发布时间】:2018-08-21 21:04:51 【问题描述】:

我编写了一个 kivy 程序,我想通过 pyinstaller 将其导出为单个 .exe 文件。我设法导出到多个文件(标准选项),但是当我将 --onefile 选项添加到 pyinstaller 时,进程卡在一行上:

    INFO: Building PKG (CArchive) out00-PKG.pkg

有人知道怎么解决吗?只是时间问题还是我在导出过程中遗漏了什么?

我的项目:

我正在使用 python 3.6.4、kivy 1.9.0 和 pyinstaller 3.3.1。 main.py 和 main.kv 文件(我只使用了 2 个文件)都在同一个文件夹中,从现在开始我将其称为 \project_folder\。在同一文件夹中还有一个名为 icon.ico 的图标。

我也在使用 UPX (upx394a),它下载到名为 \upx_path\upx394a 的文件夹中。

首先,我修改了我的 main.py 文件:

import kivy
import sys
import os

...

def resourcePath():
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS)
    return os.path.join(os.path.abspath("."))

...

if __name__=='__main__':
    kivy.resources.resource_add_path(resourcePath())
    MainApp().run()

对于导出,我运行 Windows 提示符;我移动到 \project_folder\ 然后导出:

    pyinstaller main.py --onefile --clean -y --windowed --icon=icon.ico 
    --name MyApp --upx-dir=\upx_path\upx394a --exclude-module _tkinter 
    --exclude-module Tkinter --exclude-module enchant --exclude-module twisted

我在以下位置找到了这个选项: Kivy: compiling to a single executable

以这种方式成功创建.spec文件后,我继续修改.spec文件以正确创建.exe:

1.

from kivy.deps import sdl2, glew

    在“EXE(pyz,”之后添加:

    Tree('\...\percorso dove si trova il file main.py\'),

    在“a.datas”之后,我在下一行添加:

    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],

然后我保存 .spec 文件并从提示符运行:

python -m PyInstaller MyApp.spec

这里,在提示的一些输出之后,是 pyinstaller 卡住的地方。我尝试等待一段时间,但没有任何反应。

** 我的代码:**

我在这里粘贴我正在使用的代码,希望对您有所帮助: 1. main.py

# python 3.6.4

from kivy.config import Config 
Config.set('input', 'mouse', 'mouse, multitouch_on_demand')
# set non resizable window, specify heigth and width
Config.set('graphics', 'resizable', False)
Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '600')
Config.set('graphics', 'borderless', False)

import kivy
import sys
import os
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

# la funzione definita di seguito serve per esportazione in .exe
def resourcePath():
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS)
    return os.path.join(os.path.abspath("."))

class RootWidget(FloatLayout):
    pass

class MainApp(App):
    def build(self):
        return RootWidget()

if __name__=="__main__":
    kivy.resources.resource_add_path(resourcePath()) # add this line
    MainApp().run()

    main.kv

    # File name: main.kv
    #:kivy 1.9.0
    
    #:set logo_image 'logo_1.png'
    <CreditLabel@Label>:    # custom class for credits window labels
    size_hint: [.4, .1]
    color: 1, 1, 1, 1
    
    <RootWidget>:
    TabbedPanel:
        do_default_tab: False
        tab_width: self.parent.width/5
        background_color: 0, 0, 0, 1
    
        TabbedPanelItem:
            text: 'Benvenuto!'
            color: 1, 0.5, 0, 1
            FloatLayout:
                Label:
                    size_hint: .4, .25
                    pos_hint: 'center_x': 0.5, 'center_y': 0.7
                    text: 'Benvenuto in MyBaku!'
                    font_size: 40
                    color: 1, 0.5, 0, 1
    
                Label:
                    size_hint: .6, .25
                    pos_hint: 'center_x': 0.5, 'center_y': 0.55
                    text: 'Bentornato Gianpietro! Prenditi il tuo tempo per visualizzare le tue statistiche.'
                    font_size: 18
                    color: 1, 1, 1, 1
                Label:
                    canvas:
                        Rectangle:
                            size: 80, 80
                            pos: self.right - (self.width * 0.15), self.top * 0.8 
                            source: logo_image
    
        TabbedPanelItem:
            text: 'Questa notte...'
            color: 1, 0.5, 0, 1
            FloatLayout:
    
        TabbedPanelItem:
            text: 'Statistiche globali'
            color: 1, 0.5, 0, 1
            FloatLayout:
    
        TabbedPanelItem:
            text: 'Credits'
            color: 1, 0.5, 0, 1
            FloatLayout:
                Label:
                    canvas:
                        Rectangle:
                            #:set coefficient .3
                            size: self.width * coefficient, self.width * coefficient
                            pos: self.center_x - (self.width * coefficient)/2, self.top * 0.5 
                            source: logo_image
                CreditLabel:
                    text: 'Software developed by Giampo (dev 0.1)'
                    pos_hint: 'center_x': .5, 'center_y': .45
                CreditLabel:
                    text: 'Written with Python 3.6.4 using kivy 1.9.0'
                    pos_hint: 'center_x': .5, 'center_y': .40
                CreditLabel:
                    text: 'Trento (Italy) - march 2018'
                    pos_hint: 'center_x': .5, 'center_y': .35
    

    附上卡住提示的截图 prompt problem screenshot

【问题讨论】:

【参考方案1】:

尝试删除现有的 build 和 dist 目录,看看是否解决了问题,这个解决方案对我有用,我在调用 pyinstaller 时也使用了完整路径,因为我有多个版本的 python。

【讨论】:

您不必删除完整的 build 和 dist 目录,只需删除与您所需的 exe 文件对应的文件夹即可。例如,删除 build\testexe 和 dist\testexe。这将保存您的一些其他构建,以防您没有将它们保存在其他地方。【参考方案2】:

我遇到了同样的问题,同样的“INFO:”。忘记以管理员身份运行cmd了……我这样运行后,就可以完成转换了。

【讨论】:

【参考方案3】:

对我有用的是卸载 pyinstaller,然后重新安装。

【讨论】:

以上是关于导出单个 .exe 时,PyInstaller 卡在“正在构建 PKG ...”的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyinstaller 为 kivy 应用程序生成单个 exe

有没有办法创建从 pyinstaller --onefile 生成的单个可执行 exe 文件的 MSI 包?

如何使用 pyinstaller 将多个子进程 python 文件编译成单个 .exe 文件

用PyInstaller把Python代码打包成单个独立的exe可执行文件

如何把Python脚本导出为exe程序

2020-05-23 pyinstaller 打包python项目为exe