Errore PyCharm: "No Module" quando si tenta di importare il proprio modulo (script Python)


160

Ho scritto un modulo (un file my_mod.pyche risiede nella cartella my_module). Attualmente, sto lavorando nel file cool_script.pyche risiede nella cartella cur_proj. Ho aperto la cartella in PyCharm usando File - open (e presumo, quindi, è un progetto PyCharm).

In ProjectView (CMD-7), posso vedere il mio progetto cur_proj(in rosso) e sotto "Librerie esterne" che vedo my_module. In cool_script.py, posso scrivere

from my_module import my_mod as mm

e PyCharm fornisce anche suggerimenti per my_mod. Fin qui tutto bene.

Tuttavia, quando provo a eseguire cool_script.py, PyCharm mi dice "Nessun modulo chiamato my_module"

Questo mi sembra strano, perché

A) nel terminale (OS 10.10.2), in Python, posso importare il modulo senza problemi - c'è una voce corrispondente nel PYTHONPATH in .bashrc

B) in PyCharm - Impostazioni - Progetto cur_proj - Interprete di progetto - CogWheel accanto all'interprete python - altro - mostra i percorsi per l'icona dell'interprete selezionata, i percorsi da PYTHONPATH appaiono (come penso che dovrebbero)

Quindi, perché visualizzo l'errore quando provo a eseguire cool_script.py? - Cosa mi sto perdendo?

Appunti:

Addendum 2015-febbraio-25

Quando vado in PyCharm per eseguire - Modifica configurazioni, per il mio progetto attuale, ci sono due opzioni che sono selezionate con un segno di spunta: " Aggiungi root di contenuto a PYTHONPATH " e " Aggiungi root di origine a PYTHONPATH ". Quando ho entrambi deselezionato, posso caricare il mio modulo.

Quindi funziona ora - ma perché ?

Sono emerse ulteriori domande:

  • Cosa sono le "origini del contenuto" e quali sono le "origini della radice"? E perché l'aggiunta di qualcosa al PYTHONPATH lo fa spezzare in qualche modo?
  • dovrei deselezionare entrambe queste opzioni continuamente (quindi anche nelle impostazioni predefinite, non solo le configurazioni specifiche del progetto (pannello di sinistra della finestra di dialogo Esegui / Debug Configurazioni)?

2
Potresti averlo già provato, ma quando importi moduli da altri pacchetti, includi nomepacchetto from foldername.mymodule import mymethod. Un'altra cosa che ho dovuto fare è aggiungere la cartella _init .py vuota in tutte le cartelle che useresti per accedere al tuo modulo, quindi in caso from parentfolder.childfolder.mymodule ...avessi bisogno di init in due cartelle. A seconda di dove si trovano le cartelle l'una rispetto all'altra, potrebbe essere necessario disporre di un pacchetto di livello superiore sys.pathcome descritto in questa risposta
ziddarth

4
Ho avuto anche il tuo problema. Il seguente post risolto i miei problemi: stackoverflow.com/questions/21236824/...
user3155053

Hai identificato il motivo per cui deselezionando quelle caselle di controllo funziona effettivamente invece di selezionarle?
Nithish Inpursuit Ofhappiness,

Ciò che ha funzionato per me è deselezionare Enable Django Supportle impostazioni Languages & Frameworks -> Djangonella versione Pro di PyCharm. Stava aprendo una console Django che causava problemi di importazione.
Eric Blum,

Risposte:


324

Se il tuo modulo si trova sullo stesso percorso, devi contrassegnare il percorso come Sources Root. In Esplora progetti, fai clic con il pulsante destro del mouse sulla directory che desideri importare. Quindi selezionare Mark Directory Ase selezionare Sources Root.

Spero che aiuti.


9
Questo ha funzionato per me, ma ho anche dovuto eliminare e ricreare la configurazione di esecuzione che avevo precedentemente creato prima di contrassegnare la cartella come root dei sorgenti.
grinch,

2
E bisogna aggiungerlo __init__.pyper fare in modo che Python tratti le directory come pacchetti contenenti: stackoverflow.com/questions/448271/…
Beatriz Fonseca,

Come faresti se non stessi usando Pycharm? Sto incontrando lo stesso identico problema.
Boudewijn Aasman,

@BeatrizFonseca Sì, l'ho fatto. Non sono riuscito a farlo funzionare in modo sublime, ma ho installato pycharm e ho provato la risposta qui e ha funzionato perfettamente, quindi deve avere qualcosa a che fare con la specifica della directory corretta come pacchetto root.
Boudewijn Aasman,

@BoudewijnAasman potresti provare a usare .prima del nome del pacchetto per specificare che questo pacchetto è locale
Beatriz Fonseca,

37

Quindi se vai a

-> Impostazioni -> Progetto: Progetto_programma -> Struttura del progetto,

Solo la directory in cui è disponibile il codice sorgente e contrassegnalo come "Sorgenti" (puoi vederlo nella stessa finestra). La directory con il codice sorgente dovrebbe diventare blu. Ora puoi importare in moduli che risiedono nella stessa directory.


3
Mi rendo conto che questo è un vecchio post, ma ha funzionato per me grazie.
Mike - SMT,

1
Incontrato e ignorato la stessa risposta molte volte, questa volta provato e funziona!
A.Ametov

29

PyCharm Community / Professional 2018.2.1

Stavo avendo questo problema proprio ora e sono stato in grado di risolverlo in una maniera simile a quella indicata da @Beatriz Fonseca e @Julie.

Se vai a File-> Settings-> Project: YourProjectName-> Project Structure, avrai un layout di directory del progetto in cui stai attualmente lavorando. Dovrai passare attraverso le tue directory ed etichettarle come Sourcedirectory per tutti i tuoi file Source o come Resourcecartella per i file che sono strettamente per l'importazione.

Dovrai anche assicurarti di posizionare i __init__.pyfile all'interno delle directory delle risorse, o davvero ovunque tu voglia importare, e funzionerà perfettamente.

Spero che questa risposta aiuti qualcuno, e si spera che JetBrains risolva questo fastidioso bug.


2
Questo non è specifico per PyCharm Professional , ma questa funzione è disponibile anche nell'edizione PyCharm Community . Nella struttura del progetto, fare clic con il pulsante destro del mouse sulla directory contenente il modulo, quindi selezionare Mark Directory asdal menu di scelta rapida e selezionare Sources Root.
Astitva Srivastava,

1
Potete per favore consigliare il significato di questa radice delle fonti. Anche se ha risolto il mio problema ma non ho capito bene perché lo sto facendo.
user3341078

8

Quello che ho provato è quello di trovare la posizione in cui sono i miei file.

per esempio E:\git_projects\My_project\__init__.py is my location.

Sono andato su File -> Impostazioni -> Progetto: Progetto_io -> Struttura del progetto e ho aggiunto la radice del contenuto al luogo di riferimento E:\git_projects\My_project

ha funzionato per me.


2
Fonte la cartella nella struttura del progetto ha funzionato per me. Grazie.
Microos,

Grazie @Virendra Patel e @Microos. Il mio progetto Pycharm è in corso /home/my_user/git_projects/this_git_project/this_pycharm_project/. Ho aggiunto /home/my_user/git_projects/this_git_project/come root del contenuto e /home/my_user/git_projects/this_git_project/this_pycharm_project/come unica cartella di origine e alla fine tutto ha funzionato.
KLaz,

3

my_moduleè una cartella non un modulo e non puoi importare una cartella, prova a spostarti my_mod.pynella stessa cartella cool_script.pye poi fai import my_mod as mm. Questo perché python cerca solo nella directory corrente sys.pathe quindi non lo troverà a my_mod.pymeno che non sia nella stessa directory

Oppure puoi cercare qui una risposta che ti dice come importare da altre directory.

Per quanto riguarda le altre tue domande, non lo so poiché non utilizzo PyCharm.


Puoi creare un init .py in una cartella, l'interprete python leggerà come pacchetto python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca,

3

Stavo ottenendo anche l'errore con "Aggiungi origini root a PYTHONPATH". Il mio problema era che avevo due cartelle con lo stesso nome, like project/subproject1/thing/srce project/subproject2/thing/srce avevo entrambe contrassegnate come root di origine. Quando ho rinominato una delle "thing"cartelle in "thing1"(qualsiasi nome univoco), ha funzionato.

Forse se PyCharm aggiunge automaticamente le radici di origine selezionate, non usa il percorso completo e quindi mescola le cartelle con lo stesso nome.


2

Ciò può essere causato quando l'interprete Python non riesce a trovare il tuo codice. Devi menzionare esplicitamente Python per trovare il tuo codice in questa posizione.

Fare così:

  • Vai alla tua console Python
  • Aggiungi sys.path.extend(['your module location'])alla console Python.

Nel tuo caso:

  • Vai alla tua console Python,
  • All'inizio, scrivi il seguente codice:

    import sys
    sys.path.extend([my module URI location])
  • Dopo aver scritto questa affermazione è possibile eseguire il comando seguente:

    from mymodule import functions

Un po 'brutto aggiungere il percorso in quel modo ma ha funzionato per me.
Florian Blume,

questo dovrebbe essere fatto da Pycharm, automaticamente all'apertura di una console dovrebbe includere i comandi sys.path.extend per le directory comprese le dipendenze (altri progetti) e le directory che contengono il codice sorgente del presente progetto. MA non lo fa automaticamente
fabiob

2

Il passo confuso chiave che deve essere fatto è ricreare la configurazione di esecuzione per il file di origine che si sta tentando di eseguire, in modo che l'IDE raccolga i nuovi percorsi.

Il modo in cui ha funzionato per me è stato andare su Esegui / Modifica configurazioni ..., selezionare la configurazione per il file che si sta tentando di eseguire sul lato sinistro, deselezionare la casella "Aggiungi origini di origine a PYTHONPATH", salvare, e poi torna indietro e seleziona la casella e salva. POI avrebbe funzionato.


Sorprendentemente, questo era quello di cui avevo bisogno, nonostante facessi Invalidate Cache/Restartdue volte!
Josh Friedlander,

1

Le radici del contenuto sono cartelle che contengono il codice del progetto mentre anche le origini del sorgente sono definite uguali. L'unica differenza che ho capito è che il codice nelle origini è stato creato prima del codice nella radice del contenuto.

Deselezionarli non influirebbe sul tempo di esecuzione fino al punto in cui non si creano moduli separati nel pacchetto che sono collegati manualmente a Django. Ciò significa che se uno qualsiasi dei tuoi file non contiene "from django import ..." o se una delle funzioni non viene chiamata tramite django, deselezionando queste 2 opzioni si verificherà un malfunzionamento.

Aggiornamento: il problema si presenta solo quando si utilizza Virtual Environmanet e solo quando si controlla il progetto tramite il terminale fornito. Perché il terminale funziona ancora tramite il pyhtonpath di sistema predefinito e non con l'ambiente virtuale. mentre il pannello di controllo di Python Django funziona bene.


1

La soluzione a questo problema senza dover contrassegnare Directory come radice di origine è modificare le configurazioni di esecuzione e in Esecuzione selezionare l'opzione "Reindirizza input da" e scegliere lo script che si desidera eseguire. Questo funziona perché viene quindi trattato come se lo script fosse eseguito in modo interattivo in questa directory. Tuttavia Python segnerà ancora il nome del modulo con un errore "nessun modulo chiamato x":

Reindirizzare l'input da:

Quando l'interprete esegue l'istruzione import, cerca x.py in un elenco di directory assemblate dalle seguenti fonti:

  1. La directory da cui è stato eseguito lo script di input o la directory corrente se l'interprete viene eseguito in modo interattivo
  2. L'elenco delle directory contenute nella variabile di ambiente PYTHONPATH, se impostata.
  3. Un elenco di directory dipendenti dall'installazione configurato al momento dell'installazione di Python, nel mio caso usr / lib / python3.6 su Ubuntu.

0

Pycharm 2017.1.1

  1. Fai clic su View->ToolBar&View->Tool Buttons
  2. Nel riquadro di sinistra Projectsarebbe visibile, fai clic destro su di esso e premere Autoscroll to source e quindi eseguire il codice.

Questo ha funzionato per me.


0

Ln -s. someProject

Se hai someDirectory / someProjectDir e due file, file1.py e file2.py e file1.py tenta di importare con questa riga

da someProjectDir import file2

Non funzionerà, anche se hai designato someProjectDir come directory di origine e anche se viene visualizzato nelle preferenze, nel progetto, nel menu della struttura del progetto come radice del contenuto. L'unico modo in cui funzionerà è collegando il progetto come mostrato sopra (comando unix, funziona in mac, non è sicuro dell'uso o della sintassi per Windows). Sembra che ci sia un meccanismo in cui Pycharm lo fa automaticamente sia in checkout dal controllo della versione o aggiungendolo come root di contesto, poiché il collegamento software è stato creato da Pycharm in un progetto dipendente. Quindi, basta copiare lo stesso, anche se la strana replica della directory è fastidiosa e la necessità è sconcertante. Anche nella dipendenza in cui è stata creata automaticamente, non viene visualizzata come nuova directory sotto il controllo della versione. Forse il confronto dei file .idea rivelerà di più.


-1

La risposta che ha funzionato per me è stata effettivamente ciò che OP menziona nel suo aggiornamento del 2015: deseleziona queste due caselle nella configurazione di esecuzione di Python:

  • "Aggiungi le radici del contenuto a PYTHONPATH"
  • "Aggiungi radici di origine a PYTHONPATH"

Avevo già impostato la configurazione di esecuzione per utilizzare la corretta venv, quindi PyCharm non aveva bisogno di ulteriore lavoro per aggiungere elementi al percorso. Invece stava causando errori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.