2013-09-27 11 views
22

To jest bardzo proste do odtworzenia. Jeśli mój skrypt foo.py jest:Pyinstaller --onefile ostrzeżenie pyconfig.h podczas importowania scipy lub scipy.signal

import scipy 

Następnie uruchom:

python pyinstaller.py --onefile foo.py 

Kiedy uruchomić foo.exe uzyskać:

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

Przetestowałem kilka wersji, ale ostatnie potwierdziłem 2.1dev-e958e02 działa na Win7, Python 2.7.5 (32 bit), Scipy wersja 0.12.0

Przesłałem zgłoszenie do osób w Pyroinstalatorze, ale jeszcze nic nie słyszałem. Jakieś wskazówki, jak dalej to debugować?

Odpowiedz

20

można siekać plik spec usunąć drugą instancję dodając te wiersze po = Analiza:

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

To obejście problemu, ale działało idealnie. Dzięki! – Jonno

+1

Niestety, to obejście mnie nie zadziałało. Pozbył się błędu "plik już istnieje", ale teraz plik wykonywalny --onefile po prostu zawiesza się bez żadnego ostrzeżenia. Poganiam z nim jeszcze trochę i zobaczę, czy nie mogę czegoś wymyślić. – dthor

+0

@Dthor, czy kiedykolwiek to rozwiązałeś? Wydaje mi się, że utknąłem w tym samym miejscu. – devanl

0

wpadłem archive_viewer.py narzędziowego (od PyInstaller) na jednym z moich własnych --onefile wykonywalnych, które ma ten sam błąd i okazało się, że pyconfig.h wliczone jest dwukrotnie:

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

Niestety choć, nie wiem, jak to naprawić.

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

5

Rozwijając rozwiązanie Ilya jest, myślę, że jest to trochę bardziej niezawodne rozwiązanie do modyfikowania pliku spec (ponownie miejsce po instrukcji a = Analysis ...).

Testowałem to tylko w małym programie testowym (jednym z pojedynczym poleceniem importu i wydruku), ale wygląda na to, że działa. a.datas to lista krotek łańcuchów zawierających ścieżki pyconfig.h. Konwertuję je wszystkie na małe litery, a następnie dedupuję. W rzeczywistości stwierdziłem, że konwersja wszystkich z nich na małe litery była wystarczająca, aby działała, co sugeruje mi, że program usuwający wielkość liter rozróżnia wielkość liter, gdy w systemie Windows nie powinno być rozróżniana wielkość liter. Jednak sam zająłem się dedukcją.

+0

Twoja sugestia działa w systemie Windows, ale kończy się niepowodzeniem na Linuksie. tylko fyi. –

+0

Nie jestem pewien, ale nie sądzę, aby problem miał miejsce nawet w Linuksie, więc nie potrzebujesz rozwiązania. Czy masz ten problem na Linuksie? – scornwell

+0

działa w systemie Windows. – schemacs

15

Odpowiedź wtobii @ zadziałała dla mnie. Zobacz https://github.com/pyinstaller/pyinstaller/issues/783

  1. Idź do C:\Python27\Lib\site-packages\PyInstaller\build.py
  2. Znajdź funkcję def append(self, tpl):.
  3. Zmień if tpl[2] == "BINARY": do if tpl[2] in ["BINARY", "DATA"]:
+0

Pracowałem dla mnie jak urok! – pbreach

+1

Link jest martwy; może zobacz https://github.com/pyinstaller/pyinstaller/issues/783 zamiast – SaintDako

+0

Wygląda na to, że problem został rozwiązany w wersji rozwojowej, ale nie zostały one wydane [a release] (https://github.com/Pyinstaller/Pyinstaller/Releases) od 2013 roku. Obejście problemu [scornwell] (http://stackoverflow.com/a/20695056/4794) było dla mnie skuteczne. –

1

zdałem sobie sprawę, że problemem jest to, że Windows jest wielkość liter i te 2 zdania są katalogi źródłowe są „duplikatami: zawierać \ pyconfig.h Include \ pyconfig.h

Moje rozwiązanie jest ręcznie dostosować plik .spec z po a = Analiza() rozmowy:

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

to działało w moim 2 testy.

Bardziej elastycznym rozwiązaniem byłoby sprawdzenie WSZYSTKICH elementów w przypadku kolizji niewrażliwych na wielkość liter.