PyInstaller:IOError:[Errno 2] 没有这样的文件或目录:

5
我正在尝试使用pyinstaller编译一个包含科学和MMTK模块的Python脚本。但是,pyinstaller无法包含一些.pyd模块,因此我手动将它们复制到dist文件夹中。当我执行编译后的exe文件时,它给出以下错误:
C:\Python27\hello\dist\hello>hello.exe Traceback (most recent call last): File "", line 21, in File "C:\Python27\iu.py", line 436, in importHook mod = _self_doimport(nm, ctx, fqname) File "C:\Python27\iu.py", line 521, in doimport exec co in mod.__dict__ File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/visual", line 1, in <module> File "C:\Python27\iu.py", line 436, in importHook mod = _self_doimport(nm, ctx, fqname) File "C:\Python27\iu.py", line 521, in doimport exec co in mod.__dict__ File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/visual.visual_all", line 1, in <module> File "C:\Python27\iu.py", line 436, in importHook mod = _self_doimport(nm, ctx, fqname) File "C:\Python27\iu.py", line 521, in doimport exec co in mod.__dict__ File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis", line 13, in <module> File "C:\Python27\iu.py", line 436, in importHook mod = _self_doimport(nm, ctx, fqname) File "C:\Python27\iu.py", line 521, in doimport exec co in mod.__dict__ File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.ui", line 3, in <module> File "C:\Python27\iu.py", line 477, in importHook mod = self.doimport(nm, ctx, ctx+'.'+nm) File "C:\Python27\iu.py", line 521, in doimport exec co in mod.__dict__ File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.materials", line 159, in <module> File "c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/vis.materials", line 129, in loadTGA IOError: [Errno 2] No such file or directory: 'c:\\Python27\\hello\\build\\pyi.win32\\hello\\outPYZ1.pyz/turbulence3.tga'
顺便提一下,我可以在那个位置看到outPYZ1.pyz文件。有什么想法吗?
1个回答

14
这不是关于pyd文件的问题,而是TGA文件找不到的问题。当应用程序被打包成pyinstaller时,您需要调整软件以查看不同的位置。根据访问数据文件
在--onedir分发中,这很容易:将您的数据文件列表(以TOC格式)传递给COLLECT,它们将出现在分发目录树中。元组中的名称(名称、路径、'DATA')可以是相对路径名。然后,在运行时,您可以使用以下代码查找文件:
os.path.join(os.path.dirname(sys.executable), relativename))

在一个--onefile的分发中,数据文件被捆绑在可执行文件中,在运行时由C代码提取到工作目录中(还能够重建目录树)。最好通过os.environ['_MEIPASS2']找到工作目录。因此,可以通过以下方式访问这些文件:

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

因此,如果您在程序中打开文件,请不要执行以下操作:

fd = open('myfilename.tga', 'rb')

该方法是从当前目录打开文件。因此,对于pyinstaller,它将无法正常工作,因为当前目录将不会与数据存储的位置相同。

根据您是否使用了--onefile,您需要更改为:

import os
filename = 'myfilename.tga' 
if '_MEIPASS2' in os.environ:
    filename = os.path.join(os.environ['_MEIPASS2'], filename))
fd = open(filename, 'rb')

如果是--onedir的话:

import os, sys
filename = os.path.join(os.path.dirname(sys.executable), 'myfilename.tga'))
fd = open(filename, 'rb')

我在Python方面还很新。实际上,我不知道这个turbulence3.tga文件是什么或者在哪里。在编译之前,我可以成功运行脚本。 - user1144004
能够在之前运行脚本并不意味着什么。当您使用pyinstaller时,必须适应一些默认行为。访问数据文件就是其中之一。 - tito
但我从未打算访问turbulence3.tga文件,也不知道它的位置或这个文件是什么。这是一个系统文件吗?如果是的话,请告诉我位置,以便我可以使用您上面的建议。 - user1144004
2
我对你的程序一无所知,只是在你的回溯中看到了这个:IOError: [Errno 2] No such file or directory: 'c:\Python27\hello\build\pyi.win32\hello\outPYZ1.pyz/turbulence3.tga'。你是唯一能理解自己在做什么的人 :) - tito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接