2012-03-04 9 views
3

pyinstallerを使ってpythonスクリプトをscience、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

私はPythonで非常に新たなんです。実際には、このturbulence3.tgaファイルの場所や場所はわかりません。コンパイルする前にスクリプトを正常に実行できます。 – user1144004

+0

前にスクリプトを実行できることは何も意味しません。 pyinstallerを使用する場合、いくつかのデフォルト動作を適用する必要があります。データファイルへのアクセスはその1つです。 – tito

+0

しかし、私はturbulence3.tgaファイルにアクセスするつもりはなく、そのファイルの場所や場所はわかりません。これはシステムファイルですか?それが私にあなたの上記の提案を使用できるように私に場所を教えている場合。 – user1144004

関連する問題