Pyinstaller:生成-exe文件+文件夹(在--onefile模式下)

时间:2013-12-16 02:54:41

标签: python user-interface exe pyinstaller packaging

现在我正在使用Pyinstaller。 我有一个脚本从img文件夹中获取图像..

/python
|----/img
|----|----icon1.ico
|----|----icon2.ico
|----maint.py

我生成.exe的脚本是

pyinstaller.py --windowed --noconsole --clean --onefile maint.py

问题是只生成.exe文件,但整个文件夹/ img被省略。

问题:我需要在上一行中添加哪种附加语法才能自动获取.exe文件+ / img文件夹?

2013年12月18日更新

我的意思是:在执行pyinstaller.py脚本之后,所有参数都必须在/ dist文件夹中看到:.exe文件+ / img文件夹,包含我拥有的所有图标或位图文件应用

由于

3 个答案:

答案 0 :(得分:16)

2013年12月19日更新

最后,我们明白了!

0.我正在使用当前版本的PYInstaller + Python 2.67,Sublime Text作为编辑。

1.如果您的Py脚本需要一些文件,图标,图像,您必须包含一个从项目文件夹(开发中)检索这些文件的功能,或者形成临时数据文件夹(如果部署)。此脚本必须完全位于您放置亲属路径以获取资源的部分中。请严格遵循此准则:https://stackoverflow.com/a/13790741

2.在上一个代码之后,你必须首次执行pyinstaller命令 - 我在帖子中发帖.-

3.现在,打开执行PYInstaller(位于PYinstaller /)命令后生成的.spec文件,并在“a.binaries”行之后添加下一行到EXE()函数:

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          Tree('..\\python\\images', prefix='images\\'),
....

请记住,在树(...)函数中,第一个参数是要放在外面的文件夹:表示我想要包含此文件夹的所有内容(请注意,我将相对路径视为AppStart.py文件)放入我的.EXE文件的文件容器中。

4.在该修改之后重新执行pyinstaller命令,但在这种情况下指向我的.SPEC文件:

pyinstaller.py --windowed --noconsole --clean --onefile AppStart\AppStart.spec

最后,我的应用程序可以作为可执行文件执行,而无需像所提到的那样复制和粘贴所有外部文件夹。 但我一如既往地考虑好的实用方法。

感谢您的支持。

答案 1 :(得分:0)

您必须解决许多问题才能使其正常运行。例如:

  • 获取正确的资源路径
  • 添加数据

(如前所述)第一个问题是通过根据执行模式调整路径来解决的。

NavigationController

对于第二个问题而不是树,我使用通配符(*)添加我需要的内容。

Editor > Embed In > Navigation Controller

然后在分析中

def app_path(path):
    frozen = 'not'
    if getattr(sys, 'frozen', False):
            # we are running in executable mode
            frozen = 'ever so'
            app_dir = sys._MEIPASS
    else:
            # we are running in a normal Python environment
            app_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(app_dir, path)

一个彻底的答案很长。我已经写过this article,以详细说明如何解决此问题。

答案 2 :(得分:0)

您还可以在另一个 python 脚本中运行 pyinstaller,然后使用 shutil.copytree() 将文件夹移过去。或者对单个文件使用shutil.copyfile()。

import PyInstaller.__main__
import shutil

PyInstaller.__main__.run([
    'YourProgram.py',
    '--icon=UI/Your_Icon.ico',
    '--onefile',
    '--noconsole',
], )

shutil.copytree('path/', 'dist/path')