gpt4 book ai didi

python - PyInstaller 2.0 捆绑文件为 --onefile

转载 作者:IT老高 更新时间:2023-10-28 20:53:36 28 4
gpt4 key购买 nike

我正在尝试使用 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)

In a --onefile distribution, data files are bundled within the executable and then extracted at runtime into the work directory by the C code (which is also able to reconstruct directory trees). The work directory is best found by os.environ['_MEIPASS2']. So, you can access those files through:

os.path.join(os.environ["_MEIPASS2"], relativename))

这对我,一个初级程序员来说真的没有意义..

出版商的另一份文件说..

In a --onefile distribution, data files are bundled within the executable and then extracted at runtime into the work directory by the C code (which is also able to reconstruct directory trees). The work directory is best found by sys._MEIPASS. So, you can access those files through:

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

请帮忙!

最佳答案

天哪!这个 PyInstaller 真的让我有点困惑。如果我以前的帖子听起来有点“粗鲁”,对此感到抱歉。无论如何,对于任何试图在 --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)

感谢我不记得名字的网上某人..(对不起,来晚了,我筋疲力尽了!)

然后,如果你使用 PyInstaller2.0,在 cmd 中,从 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。

也许有更好的方法,或者更漂亮的方法,但这对我有用!

关于python - PyInstaller 2.0 捆绑文件为 --onefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946650/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com