2010-02-02 6 views
15

Questa è una domanda di pitone newbie:l'importazione di un modulo in pacchetti nidificati

Ho la seguente struttura di directory:

test 
-- test_file.py 
a 
-- b 
    -- module.py  

dove test, a e b sono cartelle. Entrambi test e a sono sullo stesso livello.

module.py ha una classe chiamata shape e voglio istanziare un'istanza di esso in test_file.py. Come posso farlo?

ho provato:

from a.b import module 

ma ho avuto:

ImportError: No module named a.b 
+0

Vedere http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python. –

risposta

13

quello che vuoi è un import relativo simile:

from ..a.b import module

Il problema di questo è che non funziona se si sta chiamando test_file.py come modulo principale. Come affermato here:

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application should always use absolute imports.

Quindi, se si desidera chiamare test_file.py come modulo principale, allora si dovrebbe pensare di cambiare la struttura dei moduli e l'utilizzo di un import assoluta, altrimenti basta usare la relativa importazione dall'alto.

+0

+1. Non ho notato da dove stava cercando di importare. –

+1

All'elettore negativo (a me sconosciuto): Quando decidi di votare una risposta, devi lasciare un commento che spieghi cosa c'è che non va, in modo che chiunque lo legga (e l'autore) possa essere informato dell'errore ... – 3lectrologos

+0

Sto rilevando ValueError: Tentativo importazione relativa in non-pacchetto – khelll

7

La prima cosa da fare sarebbe quella di navigare velocemente the official docs on this.

Per creare un pacchetto di directory, è necessario aggiungere un file __init__.py. Ciò significa che avrai un tale file nelle directory a e b. Poi si può fare direttamente un

import a.b.module 

Ma si dovrà fare riferimento ad esso come a.b.module che è noioso in modo da poter utilizzare il modulo as di importazione in questo modo

import a.b.module as mod #shorter name 

e fare riferimento ad esso come mod.

Quindi è possibile istanziare le cose all'interno di mod utilizzando le convenzioni regolari come mod.shape().

Ci sono alcune altre sottigliezze. Si prega di consultare i documenti per i dettagli.

+0

Ho importato abmodule come mod e aggiunto __init__.py per tutti i pacchetti, ma sto ricevendo ImportError: Nessun modulo denominato abmodule – khelll

+0

@khell dovresti eseguire il comando dalla radice come python test/test_file.py – systempuntoout

+1

È '__init__. py'. Non 'init.py'. Si prega di controllare il link nella risposta per i dettagli. –

9
  1. La directory a deve essere un pacchetto. Aggiungi un file __init__.py per trasformarlo in un pacchetto, che rappresenta un passaggio da una semplice directory.

  2. La directory b deve anche essere un sotto pacchetto di a. Aggiungi un file __init__.py.

  3. La directory test dovrebbe anche essere un pacchetto. Difficile dire se è necessario o meno. Di solito è una buona idea che ogni directory di moduli Python sia un pacchetto formale.

  4. Per il import, il pacchetto deve essere su sys.path; questo è costruito dalla variabile di ambiente PYTHONPATH. Per impostazione predefinita, i pacchetti del sito installati e la directory di lavoro corrente sono (in effetti) le uniche due posizioni in cui è possibile trovare un pacchetto.

    Ciò significa che è necessario installare a oppure che la directory di lavoro corrente deve essere anche un pacchetto di livello superiore a a.

    OPPURE, è necessario impostare la variabile di ambiente PYTHONPATH per includere a.

http://docs.python.org/tutorial/modules.html#the-module-search-path

http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

Inoltre, http://docs.python.org/library/site.html per informazioni complete su come sys.path è costruito.

Problemi correlati