2012-03-04 35 views
3

我想编译一个python脚本使用pyinstaller模块像科学,MMTK。 Pyinstaller无法包含一些.pyd模块,因此我将它们手动复制到dist文件夹中。当我执行编译的exe它给了我下面的错误: -PyInstaller:IOError:[Errno 2]没有这样的文件或目录:

 
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文件。任何想法?

回答

6

这不是关于pyd文件,而是关于找不到TGA文件。当应用程序由pyinstaller打包时,您需要调整软件以查看其他位置。据Accessing to data files

In a --onedir distribution, this is easy: pass a list of your data files (in TOC format) to the COLLECT, and they will show up in the distribution directory tree. The name in the (name, path, 'DATA') tuple can be a relative path name. Then, at runtime, you can use code like this to find the file:

os.path.join(os.path.dirname(sys.executable), 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 os.environ['_MEIPASS2']. So, you can access those files through:

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') 
+0

我在蟒蛇很新。其实我不知道这个turbulence3.tga文件在哪里或什么。编译前我可以成功运行脚本。 – user1144004 2012-03-04 11:56:00

+0

以前能够运行脚本并不意味着什么。当您使用pyinstaller时,必须调整一些默认行为。访问数据文件就是其中之一。 – tito 2012-03-04 16:39:50

+0

但我从来没有打算访问turbulence3.tga文件,我不知道它的位置或任何此文件。这是一个系统文件吗?如果是,那么告诉我的位置,以便我可以使用你的以上建议。 – user1144004 2012-03-04 17:53:08

相关问题