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

时间:2012-03-04 07:50:18

标签: python pyinstaller

我正在尝试使用pyinstaller编译python脚本,其中包含科学,MMTK等模块。 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'

BTW我可以在该位置看到outPYZ1.pyz文件。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

这不是关于pyd文件,而是关于未找到的TGA文件。当pyinstaller打包应用程序时,您需要调整软件以查看其他位置。根据{{​​3}}:

  

在--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'], filenamen))
fd = open(filename, 'rb')

或者如果是--onedir

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