これは非常に簡単に再現できます。私のスクリプト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で実行されている2.1dev-e958e02、Python 2.7.5(32ビット)、Scipyバージョン0.12.0
Pyinstallerの人たちと一緒にチケットを提出しましたが、まだ何も聞いていません。これをさらにデバッグする方法の手がかりはありますか?
A = Analysisの後に次の行を追加することで、スペックファイルをハックして2番目のインスタンスを削除できます。
for d in a.datas:
if 'pyconfig' in d[0]:
a.datas.remove(d)
break
Wtobia @による答えは私のために働いた。 https://github.com/pyinstaller/pyinstaller/issues/78 を参照してください
C:\Python27\Lib\site-packages\PyInstaller\build.py
_に移動しますdef append(self, tpl):
関数を見つけます。if tpl[2] == "BINARY":
_を_if tpl[2] in ["BINARY", "DATA"]:
_に変更しますIlyaのソリューションを拡張すると、これはスペックファイルを変更するためのもう少し堅牢なソリューションだと思います(ここでもa = Analysis ...ステートメントの後に配置します)。
a.datas = list({Tuple(map(str.upper, t)) for t in a.datas})
私はこれを小さなテストプログラム(単一のimportおよびprintステートメントを持つもの)でのみテストしましたが、機能しているようです。 a.datasは、pyconfig.hパスを含む文字列のタプルのリストです。それらをすべて小文字に変換してから重複排除します。実際、すべてを小文字に変換するだけで機能することがわかりました。これは、Windowsで大文字と小文字を区別しない必要があるときに、pyinstallerが大文字と小文字を区別する重複排除を行うことを示唆しています。しかし、私は自分で重複排除を行いました。
問題は、Windowsで大文字と小文字が区別されず、これら2つのステートメントがソースディレクトリであることに気付きました。「重複:include\pyconfig.h Include\pyconfig.h
私の解決策は、a = Analysis()呼び出しの後に.specファイルを手動で微調整することです。
import platform
if platform.system().find("Windows")>= 0:
a.datas = [i for i in a.datas if i[0].find('Include') < 0]
これは私の2つのテストで機能しました。
より柔軟な解決策は、大文字と小文字を区別しない衝突がないかすべての項目をチェックすることです。
同じエラーが発生した自分の--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