25

これを再現するのは非常に簡単です。私のスクリプト foo.py が次の場合:

import scipy

次に実行します。

python pyinstaller.py --onefile foo.py

foo.exe を起動すると、次のようになります。

WARNING: file already exists but should not: C:\Users\username\AppData\Local\Temp\_MEI86402\Include\pyconfig.h

いくつかのバージョンをテストしましたが、確認した最新のものは、Win7、Python 2.7.5 (32 ビット)、Scipy バージョン 0.12.0 で実行されている 2.1dev-e958e02 です。

Pyinstaller 関係者にチケットを送信しましたが、まだ何も聞いていません。これをさらにデバッグする方法の手がかりはありますか?

4

5 に答える 5

21

a=Analysis の後に次の行を追加することで、spec ファイルをハックして 2 番目のインスタンスを削除できます。

for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break
于 2013-10-03T16:06:54.447 に答える
15

wtobia@ の回答が役に立ちました。https://github.com/pyinstaller/pyinstaller/issues/783を参照してください

  1. に行くC:\Python27\Lib\site-packages\PyInstaller\build.py
  2. 関数を見つけdef append(self, tpl):ます。
  3. if tpl[2] == "BINARY":に変更if tpl[2] in ["BINARY", "DATA"]:
于 2014-01-07T16:18:42.033 に答える
7

Ilya のソリューションを拡張すると、これは仕様ファイルを変更するためのもう少し堅牢なソリューションだと思います (ここでも a=Analysis... ステートメントの後に配置します)。

a.datas = list({tuple(map(str.upper, t)) for t in a.datas})

私はこれを小さなテスト プログラム (単一の import および print ステートメントを持つプログラム) でテストしただけですが、うまくいくようです。a.datas は、pyconfig.h パスを含む文字列のタプルのリストです。それらをすべて小文字に変換してから重複除去します。実際には、それらすべてをすべて小文字に変換するだけで機能することがわかりました。これは、pyinstaller が Windows で大文字と小文字を区別しないはずの場合に、大文字と小文字を区別する重複排除を行うことを示唆しています。ただし、適切な対策として、自分で重複排除を行いました。

于 2013-12-20T01:55:44.593 に答える
0

同じエラーを持つ独自の --onefile 実行可能ファイルの 1 つで (PyInstaller から) archive_viewer.py ユーティリティを実行したところ、pyconfig.h が 2 回含まれていることがわかりました。

 (31374007, 6521, 21529, 1, 'x', 'include\\pyconfig.h'),
 (31380528, 6521, 21529, 1, 'x', 'Include\\pyconfig.h'),
 (31387049, 984, 2102, 1, 'x', 'pytz\\zoneinfo\\CET'),

悲しいことに、私はそれを修正する方法を知りません。

PyInstaller マニュアル リンク: http://www.pyinstaller.org/export/d3398dd79b68901ae1edd761f3fe0f4ff19cfb1a/project/doc/Manual.html#archiveviewer

于 2013-09-27T18:58:11.227 に答える