Pyinstaller图像无法加载

时间:2017-01-14 04:48:44

标签: python pygame pyinstaller cx-freeze

问题

我试图将python文件转换为EXE文件,但是我似乎每次都遇到同样的问题,无论是CX_Freeze还是Pyinstaller。我刚尝试使用pyinstaller,并使用命令

创建了一个EXE文件
pyinstaller --onefile thepyfile

一切正常。它在dist文件中创建exe。但是,当我打开exe时,它会向我显示一个命令窗口,然后快速关闭。我设法捕获错误即时通讯使用打印屏幕,它说 pygame错误:无法打开image family.jpg。我正在使用pygame模块。

我尝试了什么?

Iv确保图像与我的python文件位于同一目录和相同的文件夹中。当我运行它时,我的.py工作正常,它只是exe。无论如何只是为了确保在我加入路径的路径中加载图像没有问题

os.path.join

它再次适用于py文件,但它在exe中不起作用。我还检查了我是否正确安装了pyinstaller,它适用于其他不涉及导入图像的exe程序。我也尝试创建一个文件夹,然后使用

os.path.join(folder,file)

但它再次在py文件中工作,但不是pyinstaller / cx_freeze exe。

一个线索?

当我在使用CX__freeze时,我发现pygame也无法导入图像。然而它给了我一个更大的错误案例,不确定它是否有用但是,它可能是一个线索?

enter image description here

请帮助

我已经遇到这个问题超过5个星期了,我迫切需要帮助。

部分代码

这是我导入图像的方式(再次在py文件中工作,但不在exe文件中)

family_image = pygame.image.load(os.path.join('folder',"family.jpg")).convert()

如果需要继承我的cx_Freeze setup.py,这也使exe文件给我图像不能加载错误。

import cx_Freeze
import sys
import pygame
import random
import math
import os
os.environ['TCL_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tc18.6"
os.environ['TK_LIBRARY'] = "C:\\Program Files\\Python35\\tcl\\tk8.6"


base = None

if sys.platform == 'win32':
    base = "Win32GUI"





executables = [cx_Freeze.Executable("Treg&Shelly.py",shortcutName="Cards",shortcutDir="DesktopFolder",base = base)]

cx_Freeze.setup(
    name = "HAPPY NEW YEARS",
    options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":["family.jpg","newyears.png"]}},
    version = "0.01",
    description = "New Years Card",
    executables = executables

    )

注意

我的所有图片都在一个单独的文件夹中,但可以通过我的python文件访问。

我也在使用python 3.5

感谢您的回复

5 个答案:

答案 0 :(得分:0)

您可以使用py2exe将python转换为可执行文件。到目前为止,这种方法对我有用。

pte.pyC:\Python\toexe>

中的脚本文件
  1. 导航至C:\Python\toexe>
  2. 将您的xxx.py python文件放在同一目录中
  3. 编辑pte.py文件,如下所示:

    ------------------------------------------

    来自distutils.core导入设置

    导入py2exe

    设置(console = [' xxx.py'])##用于CLI程序

    设置(windows = [' xxx.py'])### for gui

    ------------------------------------------

    < / LI>
  4. 执行以下命令:C:\Python\toexe> pte.py py2exe

答案 1 :(得分:0)

看看这一行:

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":["family.jpg","newyears.png"]}},

考虑:

All my images are in a separate folder

include_files部分指定基目录中的两个文件,而不是在单独的文件夹中。

尝试类似:

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":[os.path.join("imageDir", "family.jpg"),os.path.join("imageDir","newyears.png")]}},

值得注意的是,这会将文件放在基目录中。 考虑为每个文件提供一个(输入,输出)元组,而不仅仅是输入,以指定您希望这些文件到底的位置。

options = {"build_exe":{"packages":["pygame","random","math"],"excludes" : ['tcl','ttk','tkinter','Tkinter'],"include_files":[(os.path.join("imageDir", "family.jpg"), os.path.join("imageDir", "family.jpg")),(os.path.join("imageDir","newyears.png"),os.path.join("imageDir","newyears.png"))]}},

答案 2 :(得分:0)

如果您创建一个文件夹包(删除--onefile参数),pyinstaller捆绑工作正常,那么问题可能就是:

运行单文件包时,会创建临时文件夹结构。临时文件夹的名称在运行时创建,在捆绑时不知道。因此,路径未知。

然而,

Pyinstaller添加了一个属性sys._MEIPASS,其中包含临时文件夹的绝对路径。所以,试试类似:

if getattr(sys, 'frozen', False):
    wd = sys._MEIPASS
else:
    wd = ''    
family_image = pygame.image.load(os.path.join(wd,'folder',"family.jpg")).convert()

另见Pyinstaller docu

答案 3 :(得分:0)

由于您的冻结程序不知道它在哪个文件夹中,您应该使用os.getcwd()

python_powered = pygame.image.load(os.path.join(os.getcwd(),'images',"family.jpg")).conve‌​rt()

当然不要忘记import os

答案 4 :(得分:0)

只需输入pip install pygame到python文件位置的cmd提示符中,希望对此有所帮助!