2015-07-07 16 views
5

in Python 2 posso creare un modulo come questo:Come posso importare da un file nella directory corrente in Python 3?

parent 
->module 
    ->__init__.py (init calls 'from file import ClassName') 
    file.py 
    ->class ClassName(obj) 

E questo funziona. In python 3 posso fare la stessa cosa dall'interprete dei comandi e funziona (edit: Questo ha funzionato perché ero nella stessa directory con l'interprete). Tuttavia, se creo __ init __.py e fare la stessa cosa come questa:

"""__init__.py""" 
from file import ClassName 

"""file.py""" 
class ClassName(object): ...etc etc 

ottengo ImportError: non può importare nome 'ClassName', che non vede 'file' a tutti. Lo farà non appena importerò il modulo anche se posso importare tutto facendo riferimento direttamente (cosa che non voglio fare in quanto è completamente incoerente con il resto della nostra base di codice). Cosa dà?

risposta

6

Prova di importazione in questo modo:

from .file import ClassName 

Tutte here informazioni "La decisione di Guido" sulle importazioni in pitone 3 e con l'esempio completo su come importare in Python 3.

4

in Python 3 tutti le importazioni sono assolute a meno che non venga fornito un percorso relativo per eseguire l'importazione da. Dovrai o usare un'importazione assoluta o relativa.

importazione assoluta:

from parent.file import ClassName 

importazione relativa:

from . file import ClassName 
# look for the module file in same directory as the current module 
+0

che funziona, pensato che fosse qualche tipo di problema del percorso di ricerca. Chalking fino alla 'lista di cose che abbiamo cambiato in python 3 solo perché'. Grazie mille. –

+0

Questo è un buon cambiamento. Significa che puoi avere sottomoduli che hanno lo stesso nome di un modulo base nella libreria core di Python es. 'mymodule.io' e tutte le importazioni per' io' sono completamente specificate e python non importa arbitrariamente il modulo sbagliato perché l'ordine dell'elenco dei percorsi da importare è cambiato. – Dunes

+0

Sì, immagino che sia vero, per me nominare un modulo con lo stesso nome di un modulo di base è quello di evitare a tutti i costi a meno che non si stia reimplementando ma posso vedere come evitare 'oops abbiamo importato il modulo sbagliato' sarebbe molto utile. –

Problemi correlati