Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyinstaller和--onefile:如何在exe文件中包含图像_Python_Pyinstaller - Fatal编程技术网

Python Pyinstaller和--onefile:如何在exe文件中包含图像

Python Pyinstaller和--onefile:如何在exe文件中包含图像,python,pyinstaller,Python,Pyinstaller,我使用Pyinstaller创建了一个exe文件 pyinstaller.exe --onefile --icon='Loco.ico program.py 在该程序中,我在绘图中包括一个图像,当我在其文件夹中单独运行该程序时,我得到以下结果: IOError: [Errno 2] No such file or directory: 'Logo.png' # -*- mode: python -*- a = Analysis(['AMOS_Visualizer.py'], path

我使用Pyinstaller创建了一个exe文件

pyinstaller.exe --onefile --icon='Loco.ico program.py
在该程序中,我在绘图中包括一个图像,当我在其文件夹中单独运行该程序时,我得到以下结果:

IOError: [Errno 2] No such file or directory: 'Logo.png'
# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')
一种解决方案是将图像包含在exe文件夹中,如下面的链接所示:

但是,再一次强调,一个文件的全部意义就是要有一个完整的文件,而不需要额外的图像。我想解决办法可能就在这个环节上,但我还不明白

我的等级库文件如下所示:

IOError: [Errno 2] No such file or directory: 'Logo.png'
# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')
编辑:

我相信我找到了解决问题的办法

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
         pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None)

for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break

a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')
并将以下内容添加到我的main.py脚本中

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Logo = resource_path("Logo.png")

这是以下内容的变体: , 给出的答案更清楚

分为两行:

  • 您必须在“数据”中添加图像文件(在规范中或 文件或使用PyInstaller钩子脚本)
  • 如果需要,请使用系统 存在,
    使用单行
    base\u path=getattr(sys,“\u MEIPASS”,
    “.”)+“/”
    获取要连接到所有 文件的路径
    然后,
    filepath=base\u path+filepath

  • 如果您使用的是Qt Designer,您可以通过创建一个资源文件并将所有需要的图像(包括Logo.png)添加到此资源中来实现

    要创建资源文件,可以按照中的步骤操作

    将图像插入资源文件后,将Logo.png分配给窗口图标,保存QtDesigner界面,并使用命令转换资源文件:
    pyrcc4-py3 resourcetest.qrc-o resourcetest_rc.py

    最后,使用--onefile选项创建exe文件。无需编辑spec文件。

    在“hiddenimports=[]”之前添加“datas=['文件位置']”。行。 在我的情况下,这是有效的

        # -*- mode: python -*-
    
    block_cipher = None
    
    
    a = Analysis(['embed.py'],
                 pathex=['C:\\Users\\Aravind\\Desktop\\exe'],
                 binaries=[],
                 datas=['C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png'],
                 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,
              a.binaries,
              a.zipfiles,
              a.datas,
              name='embed',
              debug=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    

    我尝试了很多,但一个小时后就成功了:

    当我第一次运行程序文件MilaBild.py时,使用:

    pyinstaller -F -w MilaBild.py
    
    它需要创建“.spec”文件,我需要将以下内容添加到该文件中,如上面其他内容所述:

    a.datas += [('rosa.png','C:\\Python34\\rosa.png', 'DATA')]
    
    我的图像文件的名称是rosa.png。它与我的程序文件MilaBild.py位于同一目录下

    然后,我allso不得不在我的实际程序文件中添加上面coment中提到的部分:

    def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    
    return os.path.join(base_path, relative_path)
    
    然后,我添加了将文件获取到变量的部分,该部分工作正常:

    rosa = resource_path("rosa.png")
    

    我做了很多努力,只花了一个小时就完成了。稍后,我将尝试使用两个图像、声音和子目录。但现在是23:45,那将是新的一天,我对这个如此之远、伟大的休息槽感到非常高兴。

    最后,它比我在各种网页上找到的要简单&这里

    1) 当代码作为已编译的可执行文件运行时,可以在代码中指定临时目录中的相对路径:

    if getattr(sys, 'frozen', False): # Running as compiled
        running_dir = sys._MEIPASS + "/files/" # Same path name than pyinstaller option
    else:
        running_dir = "./" # Path name when run with Python interpreter
    iconFileName = running_dir + "mylogo.ico"
    if os.path.isfile(iconFileName):
        root.iconbitmap(iconFileName) # Exemple for tkinter usage
    
    2) 您可以在编译器选项中为文件存储位置创建的临时目录中提供路径:

    pyinstaller --onefile --add-binary "mylogo.ico;files" -i mylogo.ico myMainPrg.py
    

    这样,您就不必知道文件在开发中的完整路径,也不必知道将在生产中安装这些文件的完整路径。

    无需担心。我也有同样的问题,只是这样做就得到了答案。。。
    复制我的所有图像,并将它们粘贴到pyinstaller创建的dist/和build/目录中,问题就解决了。:)

    为此而挣扎。要知道的关键是,对于--onefile构建,您的图像将存储在sys.\u MEIPASS文件夹中

    我的tkinter应用程序中的这行代码正在破坏我的.exe:

    self.wm_iconbitmap("favicon.ico")
    
    为了修复它,我将其替换为以下内容:

    self.wm_iconbitmap(get_path("favicon.ico"))
    
    其中get_path()是我添加到模块中的一个小函数:

    def get_path(filename):
        if hasattr(sys, "_MEIPASS"):
            return f'{os.path.join(sys._MEIPASS, filename)}'
        else:
            return f'{filename}'
    
    对于上下文,我在CLI中运行此命令以生成.exe:

    pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/[...]/favicon.ico;."  "C:/Users/[...]/main.py"
    
    注意,在Win10上运行了这个


    多亏了许多其他堆栈溢出贡献者,才得以实现此目的。

    如果您认为它是重复的,只需将其标记为重复即可。无需在此处重写答案。我认为您需要使用元组
    datas=[('C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png','.')],
    并且您还需要使用pyi-makespec--onefile file file.py,首先编辑.spec文件以包含上述内容,然后构建pysintaller--options myfile.spec