2013-09-27 6 views
22

Dies ist sehr einfach neu zu erstellen. Wenn mein Skript foo.py ist:Pyinstaller --onefile Warnung pyconfig.h beim Importieren von scipy oder scipy.signal

import scipy 

Dann laufen:

python pyinstaller.py --onefile foo.py 

Als ich foo.exe starten erhalte ich:

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

Ich habe ein paar Versionen getestet, aber Das Neueste, das ich bestätigt habe, ist 2.1dev-e958e02 läuft auf Win7, Python 2.7.5 (32 Bit), Scipy Version 0.12.0 Ich habe ein Ticket mit den Pyinstaller-Leuten eingereicht, aber noch nichts gehört. Irgendwelche Hinweise, wie man das weiter debuggen kann?

Antwort

20

Sie können die Spec-Datei hacken die zweite Instanz zu entfernen, indem diese Zeilen nach einer = Analyse Zugabe:

for d in a.datas: 
    if 'pyconfig' in d[0]: 
     a.datas.remove(d) 
     break 
+0

Es ist ein Workaround, aber es hat perfekt funktioniert. Vielen Dank! – Jonno

+1

Leider funktionierte diese Abhilfe nicht für mich. Es wurde der "Datei existiert schon" -Fehler beseitigt, aber jetzt stürzt die ausführbare Datei --onefile ohne Warnung ab. Ich werde noch etwas damit herumspielen und sehen, ob ich etwas nicht herausfinden kann. – dthor

+0

@dthor, hast du das jemals gelöst? Ich scheine am selben Ort zu stecken. – devanl

0

lief ich den archive_viewer.py Dienstprogramm (von PyInstaller) auf einem meine eigenen --onefile ausführbaren Dateien, die den gleichen Fehler haben und festgestellt, dass pyconfig.h zweimal enthalten ist:

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

Leider aber ich Ich weiß nicht, wie ich es beheben kann.

PyInstaller Handbuch Link: http://www.pyinstaller.org/export/d3398dd79b68901ae1edd761f3fe0f4ff19cfb1a/project/doc/Manual.html#archiveviewer

5

Erweiterung auf Ilyas Lösung, ich denke, das ist eine etwas robustere Lösung zum Ändern der Spezifikationsdatei (erneut nach der Anweisung a = Analysis ...).

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

Getestet habe ich dies nur auf einem kleinen Testprogramm (eins mit einem einzigen Import und Print-Anweisung), aber es scheint zu funktionieren. a.datas ist eine Liste von Tupeln von Strings, die die Pfade pyconfig.h enthalten. Ich konvertiere sie alle in Kleinbuchstaben und dedupliziere sie dann. Ich fand tatsächlich, dass das Konvertieren von allen in Kleinbuchstaben ausreichte, um es zum Laufen zu bringen, was mir nahelegt, dass pyinstaller Groß- und Kleinschreibung unterscheidet, wenn es unter Windows die Groß-/Kleinschreibung nicht beachten sollte. Allerdings habe ich mich für das gute Maß deduziert.

+0

Ihr Vorschlag funktioniert unter Windows, schlägt aber unter Linux fehl. Nur zu deiner Information. –

+0

Ich bin mir nicht sicher, aber ich glaube nicht, dass das Problem auch unter Linux auftreten würde. Sie brauchen also keine Lösung. Hattest du dieses Problem unter Linux? – scornwell

+0

funktioniert unter Windows. – schemacs

15

Die Antwort von wtobia @ arbeitete für mich. Siehe https://github.com/pyinstaller/pyinstaller/issues/783

  1. Zum C:\Python27\Lib\site-packages\PyInstaller\build.py
  2. Finden Sie die def append(self, tpl): Funktion.
  3. ändern if tpl[2] == "BINARY":-if tpl[2] in ["BINARY", "DATA"]:
+0

Arbeitete wie ein Charme für mich! – pbreach

+1

Verbindung ist tot; vielleicht sehen Sie https://github.com/pyinstaller/pyinstaller/issues/783 statt – SaintDako

+0

Es sieht so aus, als ob dieses Problem in der Entwicklungsversion behoben ist, aber sie haben [eine Veröffentlichung] nicht veröffentlicht (https://github.com/pyinstaller/pyinstaller/releases) seit 2013. Die Workaround von [scornwell] (http://stackoverflow.com/a/20695056/4794) hat für mich funktioniert. –

1

erkannte ich, dass das Problem ist, dass Windows Groß- und Kleinschreibung ist und diese zwei Aussagen sind Quellverzeichnisse „Duplikate sind: umfassen \ pyconfig.h Include \ pyconfig.h

Meine Lösung ist manuell die .spec Datei mit nach dem a = Analysis() Aufruf zwicken:

import platform 
if platform.system().find("Windows")>= 0: 
    a.datas = [i for i in a.datas if i[0].find('Include') < 0] 

das funktionierte in meinen 2-Tests.

Eine flexiblere Lösung wäre, ALLE Elemente auf Groß- und Kleinschreibung zu überprüfen.

Verwandte Themen