我正在尝试使用PyInstaller 2.0将我的py脚本捆绑为.exe。我能够捆绑脚本,但在我的脚本中,我需要打开一个应该捆绑在exe中的文件(因此它是可移植的)。我在做这件事时遇到了麻烦......
在我的.py中,我有
filename = 'C:\path\to\my\file\doc.docx'
data = open(filename,'rb')
我使用PyInstaller 2.0,这在我的计算机上运行正常,但是如果我将exe转移到另一台计算机上它就不会起作用了...... PyInstaller 2.0很新,所以文件很少,而且出版商的文件相当“缺乏”。
以下是发布商关于此事的信息:(我不认为他们的文档是最新的,因为在开始时它说使用Configure.py,然后在其他文档中它说不再需要Configure.py 2.0)
在--onefile分发中,数据文件捆绑在可执行文件中,然后在运行时通过C代码(也可以重建目录树)提取到工作目录中。工作目录最好由os.environ ['_ MEIPASS2']找到。因此,您可以通过以下方式访问这些文件:
os.path.join(os.environ["_MEIPASS2"], relativename))
这对我来说真的没有意义,一个初学程序员......
来自出版商的另一份文件说..
在--onefile分发中,数据文件捆绑在可执行文件中,然后在运行时提取 通过C代码进入工作目录(也可以重建目录树)。工作目录 最好由sys._MEIPASS找到。因此,您可以通过以下方式访问这些文件:
os.path.join(sys._MEIPASS, relativename))
我用os.environ [“_ MEIPASS2”]进行了很多实验,而python似乎并不了解os.environment [“_ MEIPASS2”]。我得到了回复:
>>> print os.environ["_MEIPASS2"]
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
print os.environ["_MEIPASS2"]
File "C:\Python27\lib\os.py", line 423, in __getitem__
return self.data[key.upper()]
KeyError: '_MEIPASS2'
我也尝试过sys._MEIPASS ..是的,python响应'module'没有属性'_MEIPASS'。
在这一点上,我觉得我的脑袋即将爆炸..我感谢PyInstaller的作者的工作,但他们的文件是我见过的最糟糕的!我只需要有人帮助我将文件捆绑到exe中。我真的很想使用PyInstaller 2.0+,因为所有.spec的东西都让我对之前版本的PyInstaller感到困惑。
BTW,我正在使用Win8 64bit和python 2.7.3
请帮助!
答案 0 :(得分:26)
OMG! 这个PyInstaller让我有点困惑。如果我以前的帖子听起来有些“ranty”,那就很抱歉..无论如何,对于任何试图在--onefile PyInstaller包中包含文件的人来说,这对我有用:
将此内容包含在.py脚本中:
filename = 'myfilesname.type'
if hasattr(sys, '_MEIPASS'):
# PyInstaller >= 1.6
chdir(sys._MEIPASS)
filename = join(sys._MEIPASS, filename)
elif '_MEIPASS2' in environ:
# PyInstaller < 1.6 (tested on 1.5 only)
chdir(environ['_MEIPASS2'])
filename = join(environ['_MEIPASS2'], filename)
else:
chdir(dirname(sys.argv[0]))
filename = join(dirname(sys.argv[0]), filename)
归功于网上某位我不记得的人......(抱歉已经很晚了,我已经筋疲力尽了!)
然后,如果您在cmd中使用PyInstaller2.0,则从pyinstaller-2.0目录开始,您可以运行
pyinstaller.py --onefile myscriptsname.py
这将在pyinstaller-2.0目录中创建一个myscriptsname.spec文件。它也会创建一个exe,但这不起作用。它将在稍后更新。 现在编辑.spec,并添加以下a.datas行(记住数据,而不是数据)。我在.spec文件中添加了一些额外内容仅供参考。
a = Analysis(['ServerTimeTest_nograph.py'],
pathex=['c:\\Python27\\pyinstaller-2.0'],
hiddenimports=[],
hookspath=None)
a.datas += [('myfilesname.type','C:\\path\\to\\my\\file\\myfilesname.type','DATA')]
pyz = PYZ(a.pure)
现在,回到cmd,运行
pyinstaller.py --onefile myscriptsname.spec
这将更新/ dist目录中的.exe。
也许有更好的方式,或更漂亮的方式,但这对我有用!