2015-11-20 16 views
50

Ho la seguente directory:SystemError: modulo Parent '' non caricato, non può eseguire l'importazione relativa

myProgram 
└── app 
    ├── __init__.py 
    ├── main.py 
    └── mymodule.py 

mymodule.py:

class myclass(object): 

def __init__(self): 
    pass 

def myfunc(self): 
    print("Hello!") 

main.py:

from .mymodule import myclass 

print("Test") 
testclass = myclass() 
testclass.myfunc() 

Ma quando lo compilo, ottengo questo errore:

Traceback (most recent call last): 
    File "D:/Users/Myname/Documents/PycharmProjects/myProgram/app/main.py", line 1, in <module> 
    from .mymodule import myclass 
SystemError: Parent module '' not loaded, cannot perform relative import 

Questo funziona:

from mymodule import myclass 

ma ottengo nessun completamento automatico quando scrivo questo e c'è un messaggio: "riferimento non risolto: mymodule" e "riferimento non risolto: MyClass" E nel mio altro progetto , su cui sto lavorando, viene visualizzato l'errore: "ImportError: nessun modulo denominato 'mymodule'

Cosa posso fare?

+0

https://www.python.org/dev/peps/pep-0366/ – user2357112

+0

Non capisco. – phez1

+13

Mi sono imbattuto nello stesso problema. Apparentemente uno script in esecuzione all'interno di un pacchetto è considerato una cattiva pratica e in questo caso non è possibile utilizzare l'importazione relativa. Poiché main.py si trova all'interno dell'app del pacchetto, l'utilizzo dell'importazione relativa causerà un errore. Usa l'importazione relativa solo in moduli ed esegui gli script all'esterno del pacchetto. – neoFox

risposta

4

Io di solito utilizzare questa soluzione:

try: 
    from .mymodule import myclass 
except Exception: #ImportError 
    from mymodule import myclass 

Il che significa che il vostro IDE dovrebbe raccogliere la posizione del codice a destra e l'interprete python riuscirà a eseguire il codice.

+0

'except Exception' rileva * qualsiasi * eccezione, che non è ciò che si desidera. – DanielSank

+0

Ma poi voglio 'SystemError' o' ImportError'? – thomas

+2

Si desidera 'ImportError' – cristoper

30

Ho avuto lo stesso problema e l'ho risolto utilizzando un'importazione assoluta anziché una relativa.

per esempio nel vostro caso, si scriverà qualcosa di simile:

from app.mymodule import myclass 

Si può vedere nel documentation.

Note that 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 must always use absolute imports.

+1

In questo caso viene visualizzato un altro errore, un 'ImportError: nessun modulo chiamato' app.app '; 'app' non è un pacchetto': https://gist.github.com/anonymous/ac0b7b3c36b0a60be6273394d1ddbdfb – fiatjaf

+0

@fiatjaf per favore puoi condividere la struttura del tuo codice con noi? – Erman

+0

Grazie, @Erman. Ho appena fatto un commento su [Gist] (https://gist.github.com/anonymous/ac0b7b3c36b0a60be6273394d1ddbdfb#gistcomment-2216728). – fiatjaf

0

Se si va un livello superiore nella esecuzione dello script nella riga di comando della vostra shell bash, il problema verrà risolto. Per fare ciò, utilizzare il comando cd .. per cambiare la directory di lavoro in cui verrà eseguito lo script. Il risultato dovrebbe essere simile a questa:

[[email protected] myProgram]$ 

piuttosto che questo:

[[email protected] app]$ 

Una volta che siete lì, invece di correre lo script nel seguente formato:

python3 mymodule.py 

Change a this:

python3 app/mymodule.py 

Questo processo può essere ripetuto di nuovo a un livello in base alla struttura del diagramma ad albero. Si prega di includere anche la riga di comando della compilazione che ti dà quel messaggio di errore menzionato.

3

se si esegue il main.py sotto il app, basta importare come

from mymodule import myclass 

se si desidera chiamare main.py in un'altra cartella, l'uso:

from .mymodule import myclass 

ad esempio:

├── app 
│   ├── __init__.py 
│   ├── main.py 
│   ├── mymodule.py 
├── __init__.py 
└── run.py 

main.py

from .mymodule import myclass 

run.py

from app import main 
print(main.myclass) 

Quindi penso che la questione principale di voi è come chiamare app.main.

+0

Sì, questa è la domanda. Come lo facciamo? – fiatjaf

Problemi correlati