【发布时间】:2012-12-06 11:12:03
【问题描述】:
我正在尝试使用 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 感到困惑。
顺便说一句,我使用的是 Win8 64bit 和 python 2.7.3
请帮忙!
【问题讨论】:
-
只需使用
sys._MEIPASS即可获取应用根路径。 IDE 会给你一个错误/警告,但在应用程序内部它会起作用。默认情况下,它类似于:C:\Users\[USER]\AppData\Local\Temp\_MEIXXXXX
标签: python pyinstaller