2009-06-16 11 views
10

dla mojej aplikacji Pythona, mam następującą strukturę katalogów:Jak zaimportować moduł z katalogu na poziomie powyżej obecnego skryptu

\myapp 
\myapp\utils\ 
\myapp\utils\GChartWrapper\ 
\myapp\model\ 
\myapp\view\ 
\myapp\controller\ 

jeden z moich klasy w \ myapp \ view \ musi importować klasę o nazwie GChartWrapper. Jestem jednak otrzymuję błąd importowania ...

myview.py 
from myapp.utils.GChartWrapper import * 

Tutaj jest błąd:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart 
     args = ('No module named GChartWrapper.GChart',) 
     message = 'No module named GChartWrapper.GChart' 

Co robię źle? Naprawdę ciężko jest importować moduły/klasy w Pythonie ...

Odpowiedz

7

__init__.py file pakietu GChartWrapper oczekuje pakiet GChartWrapper na PYTHONPATH. Możesz powiedzieć w pierwszej linii:

from GChartWrapper.GChart import * 

Czy konieczne jest dołączenie pakietu GChartWrapper do struktury katalogu paczek? Jeśli tak, to jedną rzeczą, którą możesz zrobić, jest dodanie ścieżki, w której pakiet znajduje się w sys.path w czasie wykonywania. Rozumiem, że myview.py znajduje się w katalogu myapp\view? Następnie można to zrobić przed importem GChartWrapper:

import sys 
import os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) 

Jeśli nie jest to konieczne, aby mieć go w swojej strukturze katalogów, może to być łatwiejsze mieć go zainstalowanego na konwencjonalnym miejscu. Możesz to zrobić, uruchamiając skrypt setup.py, który jest zawarty w dystrybucji źródłowej GChartWrapper.

+0

Próbuję użyć GChartWrapper na App Engine, więc nie mogę naprawdę uruchomić instalacji. Dzięki! :) – Martin

2

Możesz zmienić ścieżkę, w której pyton szuka plików.

Na początku pliku źródłowego, dodać:

import sys 
sys.path.append("..") 

Lub alternatywnie zmienić zmienną środowiskową:

export PYTHONPATH=.. 
5

Nie importować moduły i pakiety z arbritary ścieżek Zamiast w Pythonie użyj pakietów i bezwzględnego importu, aby uniknąć wszystkich przyszłych problemów.

przykład:

tworzyć pliki:

MyApp\myapp\__init__.py 
MyApp\myapp\utils\__init__.py 
MyApp\myapp\utils\charts.py 
MyApp\myapp\model\__init__.py 
MyApp\myapp\view\__init__.py 
MyApp\myapp\controller\__init__.py 
MyApp\run.py 
MyApp\setup.py 
MyApp\README 

pliki powinny być puste wyjątkiem tych:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object): 
    def __init__(self): 
     print "DEBUG: An instance of GChartWrapper is being created!" 

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper 

def start(): 
    c = GChartWrapper() # creating instance of the class 

MyApp\run.py:

from myapp.view import start 
start() 

To wszystko! Po uruchomieniu punktu wejścia (run.py) wywołuje on funkcję w widoku i tworzy instancję klasy GChartWrapper. Korzystając z tej struktury, możesz zaimportować wszystko w dowolnym miejscu i używać go.

Aby uzupełnić, w MyApp\setup.py piszesz program instalacyjny dla pakietu MyApp \ myapp. Użyj distutils, aby go napisać:

from distutils.core import setup 
setup(name='MyApp', 
     version='1.0', 
     description='My Beautiful Application', 
     author='Martin', 
     author_email='[email protected]', 
     url='http://stackoverflow.com/questions/1003843/', 
     packages=['myapp'], 
     scripts=['run.py'] 
    ) 

To wystarczy. Teraz, kiedy ludzie pobierają folder MyApp, mogą po prostu zainstalować go za pomocą pliku setup.py i uruchomić go za pomocą programu run.py. Distutils mogą generować pakiety w wielu formatach, w tym instalować w oknach .EXE

Jest to standardowy sposób dystrybucji pakietów/aplikacji Pythona.

0

GChartWrapper jest również dostępny z PyPI dzięki czemu można używać easy_install lub pip zainstalować moduł:

sudo pip install GChartWrapper==0.9 

To zostanie automatycznie dodany do Twojej PYTHONPATH i wtedy można go usunąć z firmy/MojaApl/utils informator. Jeśli nie możesz użyć sudo, spójrz na użycie virtualenv (i virtualenvwrapper).

Powiązane problemy