2010-04-02 18 views
18

Niedawno zaktualizowałem system do systemu Snow Leopard, a teraz nie mogę uruchamiać programów zbudowanych za pomocą wxPython. Błędy I get to (od Eclipse + PyDev):WxPython nie pasuje do Snow Leopard?

import wx 
    File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT/System/Library/Frameworks 
    /Python.framework/Versions/2.6/Extras/lib/ 
    python/wx-2.8-mac-unicode/wx/__init__.py", line 45, in <module> 

    File "/var/tmp/wxWidgets/wxWidgets-13~231/2.6/DSTROOT 
    /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib 
    /python/wx-2.8-mac-unicode/wx/_core.py", line 4, in <module> 
    ImportError:/System/Library/Frameworks 
    /Python.framework/Versions/2.6/Extras/lib/python 
    /wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture 
    (see "man python" for running in 32-bit mode) 

ja naprawdę nie rozumiem je i byłby wdzięczny, gdyby mógł mi pomóc to zrobić, również, jeśli wiem, co się dzieje, w jaki sposób Mam zamiar je naprawić? Może to ma coś wspólnego z faktem, że Snow Leopard jest 64-bitowy?

Dzięki!

+2

Czy zamierzasz przekazać nam swoje wyniki lub zagłosować na odpowiedź? –

Odpowiedz

25

Problem polega na tym, że WxPython jest dostępny tylko na komputerze Mac w trybie 32-bitowym; jednak domyślnie Python uruchomi się w trybie 64-bitowym. Aby rozwiązać ten problem, należy utworzyć następujący skrypt o nazwie python_32:

 
#! /bin/bash 
export VERSIONER_PYTHON_PREFER_32_BIT=yes 
/usr/bin/python "[email protected]" 

Uczyń skrypt (chmod a+x python_32) i umieścić skrypt na swojej drodze. Teraz wystarczy wywołać python_32, aby uzyskać interaktywną konsolę Python, w której można używać WxPython. Jeśli chcesz napisać skrypt w języku Python, który używa tego, możesz użyć kodu shebang: #! /usr/bin/env python_32.

Teraz wyjaśnić ... podstawowy problem polega na tym, że 32-bitowy i 64-bitowy kod wykorzystuje inny interfejs binarny aplikacji (ABI), więc 32-bitowy kod i 64-bitowy kod nie mogą współistnieć w tej samej bibliotece/executable/process. Aby obsługiwać tryb 64-bitowy, musi zostać skompilowany w trybie 64-bitowym; podobnie, aby obsługiwać tryb 32-bitowy, musi być skompilowany w trybie 32-bitowym. W OS X jest to możliwe, przy użyciu uniwersalnych binariów do obsługi obu ... jednak musi być skompilowany w obu trybach (a następnie scalony). WxWidgets prawdopodobnie używa węgla, który jest dostępny tylko w trybie 32-bitowym (kakao jest dostępne zarówno w trybie 32-bitowym, jak i 64-bitowym ... Apple nie zadał sobie trudu, by Carbon był dostępny w obu trybach, ponieważ jest przestarzały), co wyjaśniłoby, dlaczego WxPython mógł być dostarczony tylko w trybie 32-bitowym. To z kolei oznacza, że ​​użycie go w Pythonie wymaga uruchomienia Pythona w trybie 32-bitowym (Python jest uniwersalnym plikiem binarnym z zarówno 32-bitowymi, jak i 64-bitowymi wersjami, dostępnymi w tym samym pliku binarnym, więc może być uruchomiony w obu trybach).

alternatywna opcja
Nie polecam robić to, bo myślę, że należy pozostawić domyślne takimi jakie są, ale skoro nie mieć wystarczającej wiedzy skryptów powłoki (trzeba użyć”./python_32" lub umieść go w folderze wymienionym w zmiennej środowiskowej "$ PATH" i wywołaj jako "python_32"), aby wykonać poprzednią opcję, możesz po prostu wykonać następujące polecenie, które spowoduje, że tryb 32-bitowy będzie domyślny:

 
defaults write com.apple.versioner.python Prefer-32-Bit -bool yes 

Jeśli zdecydujesz, że chcesz, aby powrócić do trybu 64-bitowego, można użyć następującego polecenia:

 
defaults write com.apple.versioner.python Prefer-32-Bit -bool no 

Należy pamiętać, że oba polecenia mają być wykonywane na terminalu (nie w Pythonie).

Źródło
muszę podkreślić, że oba są na podstawie zaleceń man python na Mac OS X. Tak więc, jeśli masz jakiekolwiek inne pytania, powinno się przeczytać stronę man jako komunikat o błędzie wezwał cię do zrobienia .

+0

Otrzymuję "command not found" podczas próby uruchomienia python2.6_32 z terminala. – Alex

+0

@Alex, musisz utworzyć skrypt, uczynić go wykonywalnym i umieścić go na swojej ścieżce. Czy zrobiłeś te kroki? To nie istnieje po wyjęciu z pudełka. –

+0

@Alex, czy możesz mi powiedzieć, co piszesz w linii komend, czy utworzyłeś skrypt zgodnie z instrukcją, gdzie skrypt jest, jeśli go stworzyłeś, i jaka jest wartość "$ PATH"? –

1

Kolejnym rozwiązaniem jest pobranie i zainstalowanie Pythona 2.6 dla OS X z python.org i zainstalować wxPython dla OS X z here z nim. Python.org 2.6 jest nowszy (od wersji 2.6.5) niż dostarczony przez Apple Python (2.6.1) w systemie Snow Leopard i tylko w wersji 32-bitowej.

+0

@Ned, to zły pomysł ... wszystko, co niezbędne, jest już zainstalowane, a to przyćmiłoby wersję 64-bitową. –

+1

Nadal otrzymuję "brak odpowiedniej 64-bitowej archetecture" podczas próby tej metody. – Alex

+0

Nie, to nie "przesłoni" wersji 64-bitowej. Bardzo dobrze jest mieć wiele wersji Pythona zainstalowanych w systemie OS X. I, jak już wspomniałem, zaletą jest posiadanie najnowszych poprawek w wersji 2.6.5.Kluczem do używania wielu wersji jest prawidłowe zarządzanie ścieżką wykonywania. Aby korzystać z wersji 2.6 python.org, upewnij się, że '/ Library/Frameworks/Python.framework/Versions/2.6/bin' pojawia się przed'/usr/bin' w $ PATH. Pakiet python.org instaluje polecenie skryptowe ('/ Applications/Python 2.6/Update Shell Profile.command'), które zmodyfikuje za Ciebie' .bash_profile' oraz '.profile'. –

0

Hm. Podany skrypt nie działa dla mnie - zmieniłem go w następujący sposób:

#! /bin/bash 
echo "-----------------Python 2.6 - 32 Bit setup --------------------" 
echo "Running" $1 
export VERSIONER_PYTHON_PREFER_32_BIT yes 
/usr/bin/python2.6 $1 

Nadal nie działa. Dostaję tę samą wiadomość. Ponownie przeczytać stronę man, aby upewnić się, że nie było nieporozumienie, a ja nie jestem do przodu:

ImportError: /usr/local/lib/wxPython-unicode-2.8.10.1/lib/python2.6/site-packages/wx-2.8-mac-unicode/wx/_core_.so: no appropriate 64-bit architecture (see "man python" for running in 32-bit mode) 

Naprawdę nie wiem, dlaczego to nie działa, chyba że istnieje jakaś odbudować, który musi w stosunku do rdzenia wx, który zapewnia kompatybilność 32/64-bitową. Jakieś sugestie, ktoś? Chciałbym skorzystać z gotowej instalacji Pythona od Apple (łatwiejsze w mojej pracy) i chciałbym uniknąć bardziej absurdalnych hacków.

2

Możesz także chcieć wypróbować arch Polecenie podczas wywoływania python: arch -i386 /usr/bin/python2.6, jeśli nie można uruchomić Pythona z poprawnymi ustawieniami środowiskowymi. Przełącznik "-i386" wykonuje uniwersalny binarny przebieg w 32-bitowym trybie Intel. "-x86_64" powoduje, że działa on w 64-bitowym trybie Intel. -ppc i -ppc64 dotyczy architektur PPC.

Jeśli nadal występują błędy, może to wskazywać na problem z kompilacją. Na moim komputerze mam zapasowy Python i wersję Macports. Polecenie arch działa z użyciem plików binarnych Apple i mogę zaimportować wx z powodzeniem z wiersza poleceń, ale wciąż dostaję błędy z pliku binarnego Macports: Bad CPU type in executable Zgaduję, że będę musiał wrócić i przekompilować mój binarek Pythona Macports i upewnić się, że produkuje uniwersalny plik binarny lub coś podobnego (westchnienie).

15

Chociaż widzę to już odpowiedział, że odpowiedź jest nieco źle. Seria 2.9 ma budowę 64-bitową Maca, ale tylko dla Pythona 2.7. Zobacz http://wxpython.org/download.php i poszukaj konstrukcji kakao. Z tego, co zgromadzę na liście mailingowej wxPython i kanale IRC, będziesz chciał pobrać 64-bitową kompilację Pythona z python.org, zamiast używać węża dołączonego do komputera Mac.

+0

Dzięki temu wszystko działa doskonale dla mnie! Zdecydowanie najłatwiejsze rozwiązanie, jak sądzę. –

+0

Muszę zgodzić się z Mike tutaj, ponieważ instalator kakao działa! – okysabeni

Powiązane problemy