5

Scientific、MMTKなどのモジュールを備えたpyinstallerを使用してPythonスクリプトをコンパイルしようとしています。Pyinstallerはいくつかの.pydモジュールを含めることができなかったので、それらを手動でdistフォルダーにコピーしました。コンパイルされたexeを実行すると、次のエラーが発生しました:-

C:\ Python27 \ hello \ dist \ hello> hello.exe
トレースバック(最後の最後の呼び出し):
  ファイル""、21行目、
  importHookのファイル"C:\ Python27 \ iu.py"、行436
    mod = _self_doimport(nm、ctx、fqname)
  doimportのファイル"C:\ Python27 \ iu.py"、行521
    mod.__dict__のexecco
  <module>のファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / visual"、1行目
  importHookのファイル"C:\ Python27 \ iu.py"、行436
    mod = _self_doimport(nm、ctx、fqname)
  doimportのファイル"C:\ Python27 \ iu.py"、行521
    mod.__dict__のexecco
  <module>のファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / visual.visual_all"、1行目
  importHookのファイル"C:\ Python27 \ iu.py"、行436
    mod = _self_doimport(nm、ctx、fqname)
  doimportのファイル"C:\ Python27 \ iu.py"、行521
    mod.__dict__のexecco
  <module>のファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / vis"、13行目
  importHookのファイル"C:\ Python27 \ iu.py"、行436
    mod = _self_doimport(nm、ctx、fqname)
  doimportのファイル"C:\ Python27 \ iu.py"、行521
    mod.__dict__のexecco
  <module>の3行目のファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / vis.ui"
  importHookのファイル「C:\ Python27 \ iu.py」、行477
    mod = self.doimport(nm、ctx、ctx+'。'+nm)
  doimportのファイル"C:\ Python27 \ iu.py"、行521
    mod.__dict__のexecco
  <module>のファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / vis.materials"、行159
  loadTGAのファイル"c:\ Python27 \ hello \ build \ pyi.win32 \ hello \ outPYZ1.pyz / vis.materials"、行129
IOError:[Errno 2]そのようなファイルまたはディレクトリはありません:'c:\\ Python27 \\ hello \\ build \\ pyi.win32 \\ hello \\ outPYZ1.pyz / turbulence3.tga'

ところで、私はその場所でoutPYZ1.pyzファイルを見ることができます。何か案が?

4

1 に答える 1

13

pyd ファイルではなく、TGA ファイルが見つからないということです。アプリケーションが pyinstaller によってパッケージ化されている場合、別の場所を参照するようにソフトウェアを調整する必要があります。データファイルへのアクセスによると:

--onedir ディストリビューションでは、これは簡単です。データ ファイルのリスト (TOC 形式) を COLLECT に渡すと、ディストリビューション ディレクトリ ツリーに表示されます。(name, path, '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')
于 2012-03-04T10:10:31.907 に答える