2013-03-18 13 views
6

Próbuję utworzyć kod exe z kodu Pythona. Mogę uruchomić kod po prostu w porządku z linii poleceń jak poniżej:py2exe nie znajduje wszystkich zależności

python myScript.py 

mam zainstalowanego py2exe stąd: http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/

I mają setup.py, który wygląda tak:

from distutils.core import setup 
import py2exe 

setup(console=['myScript.py']) 

I uruchomić setup.py takiego:

python setup.py py2exe 

uzyskać następujące na wyjściu :

The following modules appear to be missing 
['Carbon', 'Carbon.Files', '__pypy__', '_scproxy', 'http_parser.http', 'http_parser.reader', 'jinja2._debugsupport', 'jinja2._markupsafe._speedups', 
'jinja2.debugrenderer', 'markupsafe', 'pretty', 'socketpool', 'socketpool.util'] 

I rzeczywiście, gdy próbuję uruchomić exe, otrzymuję błędy:

$ ./myScript.exe 
Traceback (most recent call last): 
    File "restkit\__init__.pyc", line 9, in <module> 
    File "restkit\conn.pyc", line 14, in <module> 
ImportError: No module named socketpool 
Traceback (most recent call last): 
    File "myScript.py", line 12, in <module> 
ImportError: cannot import name Resource 

Co muszę zrobić, aby uzyskać py2exe znaleźć zależności?

Dzięki

+1

py2exe jest nieco przestarzały (ostatnia zmiana była w 2008 myślę?). Myślę, że [PyInstaller] (http://www.pyinstaller.org/) jest aktywnym projektem i ma znacznie lepsze wsparcie. Ponadto, patrząc na twoje komentarze do innych odpowiedzi, czy masz zainstalowane moduły na poziomie systemu lub czy są one lokalne dla twojego 'myScript.py'? – ernie

+0

Dzięki. Przeniosłem się z py2exe i próbowałem cx-freeze. Moduły są instalowane w katalogu Python. Mogę je zaimportować dobrze z powłoki Pythona. Dam PyInstaller strzał. –

+0

Czy rzeczywiście masz zainstalowane "Carbon" i "Carbon.Files" i można je importować na komputerze z systemem Windows? – abarnert

Odpowiedz

0

py2exe jest zależny od wersji Pythona. Wszystko, co robisz, wydaje się poprawne, zgaduję, że masz złą wersję zainstalowaną.

+1

Może być, ale mam Python 2.7.1 i zainstalowałem plik py2exe-0.6.9.win32-py2.7.exe. Wydaje się prawidłowe. –

+0

tak, przepraszam, używam tej samej wersji i działało dobrze. Możesz spróbować ponownie zainstalować, jeśli jeszcze tego nie zrobiłeś. –

+0

westchnienie. Mam ten sam problem z cx-freeze, co prowadzi mnie do przekonania, że ​​coś w tym jest, co uniemożliwia Pythonowi znalezienie zależności. –

1

Carbon to nazwa dwóch różnych rzeczy specyficznych dla Mac.

Po pierwsze, w wersji 2.x na kompilacjach Mac OS X i Mac Classic znajduje się Carbon package w standardowej bibliotece, która służy do wywoływania interfejsów API Carbon/Toolbox (oraz w OS X, CoreFoundation i znajomych).

Po drugie, zarówno w wersji 2.x, jak i 3.x, w systemie Mac OS X, z PyObjC, opakowanie PyObjC o numerze Carbon.Framework ma nazwę Carbon. (PyObjC nie jest częścią stdlib, ale ma wbudowane wersje Pythona firmy Apple i większość zewnętrznych kompilacji poza oficjalnymi instalatorami python.org).

Żadne z nich nie będzie istnieć w systemie Windows.

py2exe stara się być inteligentna i importować jedynie rzeczy istotne dla Twojej platformy. Jednak łatwo jest oszukać. jest wymagane

try: 
    import Carbon.Files 
except: 
    Carbon = collections.namedtuple('Carbon', 'Files') 
    Carbon.Files = None 

if Carbon.Files: 
    Carbon.Files.whatever(…) 

... może uczynić py2exe myśleć Carbon.Files: Na przykład coś takiego.

Oczywiście, to nie jest cały twój problem, ale jest bardzo dużą czerwoną flagą, że kod zależności modułu py2exe nie działa dla twojego projektu. Prawdopodobnie masz podobne problemy ze wszystkimi rodzajami innych modułów, więc brakuje zarówno niektórych rzeczy, których potrzebujesz, jak i wymagających pewnych rzeczy, których nie masz, i to prawdopodobnie powoduje rzeczywiste problemy.

Jak FAQ wyjaśnia, można debugować przez uruchomienie kodu moduł-Finder, aby zobaczyć, gdzie to się dzieje nie tak, jak to:

python -m py2exe.mf -d path/to/my_file.py 

Można wykorzystać te informacje, aby poprowadzić kod module-Finder lub przepisać swój kod, aby nie mylić py2exe.

Albo, mówiąc prościej, wystarczy jednoznacznie uwzględnić i wykluczyć moduły w swoim setup.py jako obejście, nie martwiąc się, dlaczego są one nieprawidłowo wykrywane.