mcf*_*fly 10 python exe build environment-variables pyinstaller
之前已经问过这个问题,我似乎无法使我的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)
Run Code Online (Sandbox Code Playgroud)
当我运行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/*.*'
Run Code Online (Sandbox Code Playgroud)
有谁知道我哪里出错了?谢谢!
**编辑**
这正是我想要做的.
我的主脚本有一个设置(导入),如下所示.基本上我希望能够在其中包含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'
Run Code Online (Sandbox Code Playgroud)
我正在使用PyInstaller 2.1.我也使用Python 2.7.5(32位).我的操作系统是Windows 8(64位).我的Matplotlib是1.3.0,底图是1.0.6.Wxpython是2.8.12.1(Unicode).
我去指挥并做:> pyinstaller myscript.py.这会生成我稍微编辑的.spec文件.以下是我编辑的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')
Run Code Online (Sandbox Code Playgroud)
我希望这是一个单文件可执行文件,因此数据文件应该打包在可执行文件中.在其他pyinstallers上,我通常没有MEIPASS的问题.但是,由于Matplotlib和Basemap,我需要使用2.1.如果有人可以完美地构建这个exe - 你能告诉我我需要调整什么吗?谢谢!
****编辑****
如果有人可以弄清楚如何用py2exe做这个 - 这也会很棒.任何我可以把它变成一个可执行文件的方式都是值得的!
小智 11
我想我看到了问题.您没有将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')
Run Code Online (Sandbox Code Playgroud)
请注意,我根本没有使用COLLECT().
如果您在以下位置查看 2.1文档:PyInstaller规范文件操作,您会注意到COLLECT()不用于--onefile模式.
如果查看sys._MEIPASS指向的解压缩目录,您可能会注意到您的spec文件中的数据文件根本就不存在.
我希望这有帮助.