python - 使用 PyInstaller 2.1 和 MEIPASS 错误捆绑数据文件 --onefile

标签 python build environment-variables exe pyinstaller

这个 question之前有人问过我,我似乎无法让我的 PyInstaller 正常工作。我在 mainscript.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)

当我运行 py 文件(在 IDLE 中)时,我的应用程序运行良好并加载了所有数据文件。但是,当我将它与 PyInstaller 2.1(一种文件方法)捆绑在一起时,我在 exe 构建后收到以下错误:

Traceback (most recent call last):
File "<string>", line 37, in <module>
WindowsError: [Error 3] The system cannot find the path   
specified: 'C:\\Users\\Me\\AppData\\Local\\Temp\\_MEI188722\\eggs/*.*'

有人知道我哪里出错了吗?谢谢!

** 编辑 **

这正是我想要做的。

我的主脚本有一个如下所示的设置(导入)。本质上,我希望能够在其中包含 Matplotlib、 basemap 和资源路径:

import os,sys
import matplotlib
matplotlib.use('WX')
import wx
from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from mpl_toolkits.basemap import Basemap
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import Calculate_Distance # A personal py file of mine

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)

bmap=wx.Bitmap(resource_path('test_image.png'))

print 'hello'

我正在使用 PyInstaller 2.1。我也在使用 Python 2.7.5(32 位)。我的操作系统是 Windows 8(64 位)。我的 Matplotlib 是 1.3.0, basemap 是 1.0.6。 Wxpython 是 2.8.12.1 (Unicode)。

我去命令并执行:> pyinstaller myscript.py。这会生成我稍微编辑的 .spec 文件。以下是我编辑的规范文件:

data_files = [('Calculate_Distance.py', 'C:\\Users\\Me\\Documents\\MyFolder\\Calculate_Distance.py',
              'DATA'), ('test_image.png', 'C:\\Users\\Me\\Documents\\MyFolder\\test_image.png',
              'DATA')]

includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
            'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
            'Tkconstants', 'Tkinter']
packages = []
dll_excludes = []
dll_includes = []

a = Analysis(['myscript.py'],
             pathex=['C:\\Users\\Me\\Documents\\MyFolder','C:\\Python27\\Lib\\site-packages\\mpl_toolkits\\basemap\\*'],
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          a.binaries - dll_excludes + dll_includes + data_files,          
          name='MyApplication.exe',
          debug=False,
          strip=None,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name='MyApplication')  

我希望这是一个单文件可执行文件,因此数据文件应打包在可执行文件中。在其他 pyinstaller 上,我通常没有遇到 MEIPASS 的问题。但是,由于 Matplotlib 和 Basemap,我需要使用 2.1。如果有人可以完美地构建这个 exe - 你能告诉我我需要调整什么吗?谢谢!

****编辑****

如果有人能弄清楚如何使用 py2exe 来做到这一点——那就太好了。任何我能把它变成一个可执行文件的方法都是值得的!

最佳答案

我想我看到了问题所在。您没有将 data_files 输入到您的 Analysis 对象中。 以下是我在 .spec 文件中添加数据文件的方法:

a = Analysis(....)
a.datas += [('7z.dll', '7z.dll', 'DATA')]
a.datas += [('7z.exe', '7z.exe', 'DATA')]
a.datas += [('collection.xml', 'collection.xml', 'DATA')]
a.datas += [('License.html', 'License.html', 'DATA')]

pyz = PYZ(a.pure)

exe = EXE(pyz,
          a.scripts + [('O', '', 'OPTION')],
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'blah.exe'),
          debug=False,
          strip=None,
          upx=False,
          console=True,
          icon=r'..\NCM.ico')

请注意,我根本没有使用 COLLECT()。

如果您在以下位置查看 2.1 文档:PyInstaller Spec File Operation您会注意到 COLLECT() 不用于 --onefile 模式。

如果您查看 sys._MEIPASS 指向的提取目录,您可能会注意到您的规范文件根本不存在数据文件。

我希望这会有所帮助。

关于python - 使用 PyInstaller 2.1 和 MEIPASS 错误捆绑数据文件 --onefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669640/

相关文章:

python - 使用 Python 和 split() 解析文本文件

python - 在迭代数据框时向其添加元素

python - 为什么 vars(response) 不显示response.text? (使用Python请求模块)

visual-studio-code - 有没有办法在 Visual Studio Code 中设置环境变量?

docker - 如何将我放在 .env 文件中的变量传递到我的 docker swarm 中的容器?

python - 当输入来自CGI时,如何在OpenCV中读取解析图像

android - 无法执行 aapt(AbstractIndexedListIterator.next(AbstractIndexedListIterator.java :80) 处的 NoSuchElementException

java - 教哪个构建工具?

c++ - 如何用CMake测试项目中所有的header是否都是自包含的?

amazon-web-services - EC2_HOME 未设置。从 Cron 运行 AWS 命令