20

PyInstaller 2.0 を使用して、py スクリプトを .exe としてバンドルしようとしています。スクリプトをバンドルすることはできますが、私のスクリプトでは、exe にバンドルする必要があるファイルを開く必要があります (移植可能です)。私はこれを行うのに問題があります..

私の.pyには、

filename = 'C:\path\to\my\file\doc.docx'
data = open(filename,'rb')

私は PyInstaller 2.0 を使用しており、これは私のコンピューターでは正常に動作しますが、exe を別のコンピューターに転送すると動作しません.. PyInstaller 2.0 はかなり新しいため、ドキュメントはほとんどなく、発行元のドキュメントはかなり「足りない」。

この問題に関する発行者の情報は次のとおりです。

--onefile ディストリビューションでは、データ ファイルは実行可能ファイル内にバンドルされ、実行時に C コードによって作業ディレクトリに抽出されます (ディレクトリ ツリーを再構築することもできます)。作業ディレクトリは、os.environ['_MEIPASS2'] で見つけるのが最適です。したがって、これらのファイルには次の方法でアクセスできます。

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

それは、初心者のプログラマーである私には本当に意味がありません..

出版社からの別の文書によると..

--onefile ディストリビューションでは、データ ファイルは実行可能ファイル内にバンドルされ、実行時に C コードによって作業ディレクトリに抽出されます (ディレクトリ ツリーを再構築することもできます)。作業ディレクトリは、sys._MEIPASS によって最適に検出されます。したがって、これらのファイルには次の方法でアクセスできます。

os.path.join(sys._MEIPASS, relativename))

私は os.environ["_MEIPASS2"] をかなり試しましたが、python は os.environment["_MEIPASS2"] を理解していないようです。私はこれを取り戻します:

>>> print os.environ["_MEIPASS2"]

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    print os.environ["_MEIPASS2"]
  File "C:\Python27\lib\os.py", line 423, in __getitem__
    return self.data[key.upper()]
KeyError: '_MEIPASS2'

私もsys._MEIPASSで実験しました..ええ、Pythonは「モジュール」に属性「_MEIPASS」がありませんと応答します。

この時点で、頭が爆発しそうです.. PyInstaller の作成者の仕事には感謝していますが、彼らのドキュメントは私が今まで見た中で最悪です! 私のファイルをexeにバンドルするのを手伝ってくれる人が必要です。すべての .spec が PyInstaller の以前のバージョンと混同するため、PyInstaller 2.0+ を使用したいと思います。

ところで、私はPython 2.7.3でWin8 64ビットを使用しています

助けてください!

4

1 に答える 1

28

ああ、神様!このPyInstallerは、私を少し混乱させました。以前の投稿が少し「不満」に聞こえる場合は、申し訳ありません。とにかく、-onefile PyInstallerパッケージにファイルを含めようとしている人にとっては、これでうまくいきました。

これを.pyスクリプトに含めます。

filename = 'myfilesname.type'
if hasattr(sys, '_MEIPASS'):
    # PyInstaller >= 1.6
    chdir(sys._MEIPASS)
    filename = join(sys._MEIPASS, filename)
elif '_MEIPASS2' in environ:
    # PyInstaller < 1.6 (tested on 1.5 only)
    chdir(environ['_MEIPASS2'])
    filename = join(environ['_MEIPASS2'], filename)
else:
    chdir(dirname(sys.argv[0]))
    filename = join(dirname(sys.argv[0]), filename)

名前を覚えていないオンラインの誰かのクレジット..(遅れてすみません、私は疲れ果てています!)

次に、cmdでpyinstaller-2.0ディレクトリからPyInstaller2.0を使用している場合は、次のコマンドを実行できます。

pyinstaller.py --onefile myscriptsname.py

これにより、pyinstaller-2.0ディレクトリにmyscriptsname.specファイルが作成されます。また、exeも作成されますが、機能しません。後で更新されます。次に、その.specを編集し、次のa.datas行を追加します(データではなくデータを覚えておいてください)。参考までに、.specファイルに少し余分なものを含めました。

a = Analysis(['ServerTimeTest_nograph.py'],
             pathex=['c:\\Python27\\pyinstaller-2.0'],
             hiddenimports=[],
             hookspath=None)
a.datas += [('myfilesname.type','C:\\path\\to\\my\\file\\myfilesname.type','DATA')]
pyz = PYZ(a.pure)

ここで、cmdに戻り、実行します

pyinstaller.py --onefile myscriptsname.spec

これにより、/distdirの.exeが更新されます。

より良い方法、またはよりきれいな方法があるかもしれませんが、これは私にとってはうまくいきました!

于 2012-12-20T00:27:47.643 に答える