Errore Python "ImportError: nessun modulo denominato"


452

Python è installato in una directory locale.

Il mio albero di directory è simile al seguente:

(local directory)/site-packages/toolkit/interface.py

Il mio codice è qui:

(local directory)/site-packages/toolkit/examples/mountain.py

Per eseguire l'esempio, scrivo python mountain.pye nel codice ho:

from toolkit.interface import interface

E ottengo l'errore:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Ho già controllato sys.pathe lì ho la directory /site-packages. Inoltre, ho il file __init__.py.binnella cartella del toolkit per indicare a Python che questo è un pacchetto. Ho anche un __init__.py.binnella directory degli esempi.

Non so perché Python non riesca a trovare il file quando è dentro sys.path. Qualche idea? Può essere un problema di autorizzazioni? Ho bisogno di un permesso di esecuzione?


3
Verifica di disporre dell'autorizzazione in lettura per quel file da Python. Vedi: stackoverflow.com/a/20999950/1657225
CSN

1
Assicurati di contrassegnare la tua directory come "radice delle risorse" per far sapere a PyCharm che si tratta di un pacchetto.
emmmphd,

Il problema nel mio caso era che non esisteva l'autorizzazione per i moduli appena installati 755. Questo perché umasksulla macchina era 0027dovuto il othersfatto che non disponeva readdell'autorizzazione che impediva la lettura del modulo. L'aggiunta readdell'autorizzazione ha risolto il mio problema. Vale la pena controllare l'autorizzazione della directory di destinazione post-installazione.
anu,


forse il nome della directory locale è interface (è stato un conflitto).
Benyamin Jafari,

Risposte:


267

Sulla base dei tuoi commenti al post di orip, suppongo che sia quello che è successo:

  1. Hai modificato __init__.pysu Windows.
  2. L'editor di Windows ha aggiunto qualcosa di non stampabile, forse un ritorno a capo (fine della riga in Windows è CR / LF; in unix è solo LF), o forse un CTRL-Z (fine del file di Windows).
  3. Hai usato WinSCP per copiare il file nella tua casella unix.
  4. WinSCP ha pensato: "Questo ha qualcosa che non è un testo di base; inserirò un'estensione .bin per indicare i dati binari."
  5. La mancanza __init__.py(ora chiamata __init__.py.bin) significa che Python non capisce il toolkit come un pacchetto.
  6. Si crea __init__.pynella directory appropriata e tutto funziona ...?

50
Inoltre, python -c 'import sys; print sys.path 'aiuta - a volte l'utente ha inserito i file in un percorso non scansionato.
mikebabcock,

1
Sto usando la stessa cosa, tranne WinSCP non ha aggiunto .bin.
utente

9
se ho un "__init__.py" vuoto accadrà la stessa cosa?
dietbacon,

2
OMG, tu regni! Questa è la mia storia: 1. Hai modificato init .py su Windows 2. Ha aggiunto una TAB invece di spazi 3. Vai su Google molto fino a trovare questo post! ;)
GBrian

1
Per me il problema era che stavo usando python driver.pyquando avrei dovuto usarlo da python3 driver.pyquando ho installato pip3.
Eric Wiener,

72

fa

(local directory)/site-packages/toolkit

avere un __init__.py?

Per fare in modo che l'importazione passi attraverso le tue directory ogni directory deve avere un __init__.pyfile.


1
Buon punto! Nota: da Python 3.3, qualsiasi directory su sys.path con un nome che corrisponde al nome del pacchetto verrà riconosciuta.
Patrick Martedì

1
non è necessario solo per i riferimenti relativi al percorso? perché deve ogni directory averlo?
Sonic Soul

56

Mi sono imbattuto in qualcosa di molto simile quando ho fatto questo esercizio in LPTHW; Non sono mai riuscito a far riconoscere a Python che avevo file nella directory da cui stavo chiamando. Ma alla fine sono riuscito a farlo funzionare. Quello che ho fatto e che consiglio, è provare questo:

(NOTA: dal tuo post iniziale, presumo che tu stia utilizzando una macchina basata su * NIX e stia eseguendo cose dalla riga di comando, quindi questo consiglio è su misura per questo. Da quando eseguo Ubuntu, questo è quello che ho fatto)

1) Cambia directory (cd) nella directory sopra la directory in cui si trovano i tuoi file. In questo caso, stai tentando di eseguire il mountain.pyfile e provi a chiamare il toolkit.interface.pymodulo, che si trova in directory separate. In questo caso, andresti nella directory che contiene i percorsi di entrambi i file (o, in altre parole, la directory più vicina condivisa dai percorsi di entrambi i file). Che in questo caso è la toolkitdirectory.

2) Quando ci si trova nella tookitdirectory, immettere questa riga di codice sulla riga di comando:

export PYTHONPATH=.

Questo imposta il tuo PYTHONPATH su ".", Il che significa sostanzialmente che il tuo PYTHONPATH ora cercherà qualsiasi file chiamato all'interno della directory in cui ti trovi, (e più precisamente, nei rami della sottodirectory della directory in cui ti trovi. Quindi non si limita a cercare nella directory corrente, ma in tutte le directory presenti nella directory corrente).

3) Dopo aver impostato PYTHONPATH nel passaggio precedente, eseguire il modulo dalla directory corrente (la toolkitdirectory). Python ora dovrebbe trovare e caricare i moduli specificati.

Spero che sia di aiuto. Ero abbastanza frustrato con questo me stesso.


2
O su Windows set PYTHONPATH=..
cjbarth,

Questo ha funzionato per me. Inoltre, ho COMPLETAMENTE semplificato le mie frustrazioni di PYTHONPATH, poiché dovrei aggiornarlo su un percorso assoluto ogni volta che cambio macchine. Grazie, grazie, grazie.
the_e

41

Su * nix, assicurati anche che PYTHONPATH sia configurato correttamente, in particolare che abbia questo formato:

 .:/usr/local/lib/python

(Ricorda .:all'inizio, in modo che possa cercare anche nella directory corrente.)

Potrebbe anche essere in altre posizioni, a seconda della versione:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
Può anche essere .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7e così via a seconda della versione
Nikita Volkov

Per me, il modulo è in /usr/local/lib/python3.4/dist-packages ma quando scrivo python3 nel terminale (ubuntu), e provo a importarlo, non mi permette, dicendolo non esiste. "ImportError: nessun modulo x esiste"
user65165

Anche l'aggiunta #!/usr/bin/pythonalla fine di un file dovrebbe funzionare, giusto?
Nearoo,

1
@Nearoo Non penso che funzionerà. Inoltre di solito questo shebang viene aggiunto nella parte superiore di un file.
Renaud,

2
Su MacOSX è stato risolto aggiungendo PYTHONPATH = / usr / local / lib / python2.7 / site-pacchetti agli script di avvio.
Johan Snowgoose,

23

Ho risolto il mio problema e scriverò un riepilogo delle cose sbagliate e della soluzione:

Il file deve essere chiamato esattamente __init__.py. Se l'estensione è diversa come nel mio caso, .py.binPython non può spostarsi tra le directory e quindi non può trovare i moduli. Per modificare i file è necessario utilizzare un editor Linux, come vi o nano . Se usi un editor di Windows, questo scriverà alcuni caratteri nascosti.

Un altro problema che stava influenzando era che avevo una versione di Python installata dal root, quindi se qualcuno sta lavorando con un'installazione locale di Python, assicurati che l'installazione di Python che esegue i programmi sia la Python locale. Per verificare ciò, basta fare which pythone vedere se l'eseguibile è quello che si trova nella tua directory locale. In caso contrario, modifica il percorso, ma assicurati che la directory Python locale sia precedente all'altra Python.


Un problema che ho riscontrato è che un modulo è stato (ri) installato da pip con solo l'utente root ad accedervi, quindi l'utente che ha eseguito il programma non lo ha visto.
Jānis Elmeris,

@ JānisElmeris puoi approfondire il commento sopra, penso di trovarmi di fronte anche a un errore simile. Ho i miei __init__.pyfile inseriti nella relativa directory ma ho installato manualmente un pacchetto usando setup.py. In che modo l'installazione di un nuovo pacchetto avrebbe interferito con le importazioni.
Krishna Oza,

@darth_coder, scusa, è stato sei anni fa e non ricordo il caso. Inoltre, ho a che fare con Python molto poco, per niente ultimamente. Da quello che ho scritto, posso solo pensare di aver installato un pacchetto come root, che ha cambiato le autorizzazioni in modo che altri utenti non avessero accesso a loro.
Jānis Elmeris,

19

una soluzione semplice è installare il modulo usando python -m pip install <library-name>invece di pip install <library-name> te puoi usare sudo in caso di restrizioni amministrative


2
Cosa python -mraggiunge di fronte pip install?
sporca

1
@sporc - quando usi il flag della riga di comando -m, Python importerà un modulo o un pacchetto per te e poi lo eseguirà come uno script. Quando non usi il flag -m, il file che hai nominato viene eseguito solo come uno script.
Tony Ciccarone,

Non sono sicuro di cosa stia cercando di dire che questa risposta funzioni python -m pip..., ma pip...non lo hanno fatto: sono effettivamente la stessa cosa, supponendo che siano effettivamente nella stessa pythondirectory. Probabilmente, la situazione osservata era che il pipprogramma autonomo non era disponibile in alcune versioni precedenti di Python (ma ora è nelle ultime 2.7 e 3.x). In quel caso, si pythontrovava in un virtual virtual locale e pipnon lo era, quindi python -m pip installsi installava nel virtual virtual locale, mentre piptentava di installarlo nel sistema Python (e falliva senza sudo). In ogni caso, non ha senso.
michael,

17

Per contrassegnare una directory come pacchetto è necessario un file denominato __init__.py, questo aiuta?


Ho già un file chiamato init .py.bin, se cambio il nome in init .py, ottengo questo errore: /__init__.py ", riga 1" utilities "," demo "] ^ SyntaxError: sintassi non valida
Eduardo,

Cosa c'è in init .py? Pubblicalo come parte della tua domanda, per favore.
S.Lott

Non c'è nulla, è vuoto, è stato con il pacchetto che scarico, devo scrivere qualcosa nel file ?.
Eduardo,

@ S.Lott: non hai bisogno di mettere nulla nel tuo init .py giusto?
igorgue,

1
@Eduardo. Il tuo init .py riceve un errore. E dici che è vuoto. È difficile conciliare. E non può essere chiamato init .py.bin - Python ignorerebbe questo file. In genere, non può contenere nulla.
S.Lott

16

Utilizzando PyCharm(parte della suite JetBrains) è necessario definire la directory degli script come Origine:
Right Click > Mark Directory as > Sources Root


12

Stai leggendo questa risposta dice che sei __init__.pynel posto giusto, hai installato tutte le dipendenze e stai ancora ottenendo il ImportError.

Stavo affrontando un problema simile, tranne per il fatto che il mio programma avrebbe funzionato bene quando eseguito con PyCharm ma l'errore sopra riportato quando l'avrei eseguito dal terminale. Dopo aver scavato ulteriormente, ho scoperto che PYTHONPATHnon aveva la voce per la directory del progetto. Quindi, ho impostato PYTHONPATHper l' istruzione Import funziona su PyCharm ma non dal terminale :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

C'è un altro modo per farlo usando sys.pathcome:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

È possibile utilizzare insert / append in base all'ordine in cui si desidera cercare il progetto.


12

Per me, è stato qualcosa di veramente stupido. Ho installato la libreria usando pip3 installma stavo eseguendo il mio programma python program.pyal contrario python3 program.py.


1
Wow ! Questo ha funzionato anche per me.
JavaDeveloper

1
Mi hai salvato la giornata.
Aymen,

7

Sì. È necessario che la directory contenga il __init__.pyfile, ovvero il file che inizializza il pacchetto. Ecco, dai un'occhiata a questo .

I file __init__.py sono richiesti per fare in modo che Python tratti le directory come pacchetti contenenti; ciò viene fatto per impedire alle directory con un nome comune, come stringa, di nascondere involontariamente moduli validi che si verificano successivamente nel percorso di ricerca del modulo. Nel caso più semplice, __init__.py può essere solo un file vuoto, ma può anche eseguire il codice di inizializzazione per il pacchetto o impostare la variabile __all__, descritta più avanti.


6
  1. Devi avere il file __ init__.py nella stessa directory in cui è il file che stai importando.
  2. Non è possibile provare a importare un file con lo stesso nome ed essere un file da 2 cartelle configurate su PYTHONPATH.

ad es .: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / cartella1: / opt / cartella2

/ Opt / cartella1 / foo

/ Opt / cartella2 / foo

E, se stai cercando di importare il file foo, Python non saprà quale vuoi.

da foo import ... >>> importerror: nessun modulo chiamato foo


5

I miei due centesimi:

inserisci qui la descrizione dell'immagine

Sputare:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Questo mi ha confuso a morte - ho seguito post e post che suggerivano brutti hack di syspath (come vedi i miei __init__.pyerano tutti lì). Bene, risulta che game / oblivion.py e game / oblivion stavano confondendo il pitone che sputava fuori piuttosto inutile "Nessun modulo chiamato RecordGroups". Sarei interessato a una soluzione alternativa e / o ai link che documentano questo comportamento (stesso nome) -> EDIT (2017.01.24) - dare un'occhiata a Cosa succede se ho un modulo e un pacchetto con lo stesso nome?Pacchetti interessanti normalmente hanno la precedenza, ma a quanto pare il nostro launcher viola questo.

EDIT (17.01.2015): non ho menzionato che utilizziamo un launcher personalizzato sezionato qui .


più come se il percorso fosse spento. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Potrebbe voler risolverlo aggiungendo il tuo codice Python da usare:game.oblivion.patchers.RecordGroups
Dwight Spencer,

@DwightSpencer: sono sicuro di aver importato i "RecordGroups" game.oblivion.__init__.pyma potrei doverlo verificare
Mr_and_Mrs_D

4

Linux: i moduli importati si trovano in /usr/local/lib/python2.7/dist-packages

Se stai usando un modulo compilato in C, non dimenticare di modificare il file .so dopo sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

Nel mio caso, il problema era che stavo collegando al debug python & boost::Python, il che richiede che l'estensione sia FooLib_d.pyd, non solo FooLib.pyd; rinominare il file o aggiornare le CMakeLists.txtproprietà risolto l'errore.


3

Se hai provato tutti i metodi forniti sopra ma non sei riuscito, forse il tuo modulo ha lo stesso nome di un modulo integrato. Oppure, un modulo con lo stesso nome esistente in una cartella con una priorità elevata sys.pathrispetto a quella del modulo.

Per eseguire il debug, dì i tuoi from foo.bar import bazreclami ImportError: No module named bar. Passando a import foo; print foo, che mostrerà il percorso difoo . È quello che ti aspetti?

In caso contrario, rinominare fooo utilizzare le importazioni assolute .


1
Per me, questo cede ImportError: No module named foo.
alex

3

Il mio problema era che ho aggiunto la directory con il __init__.pyfile a PYTHONPATH, quando in realtà avevo bisogno di aggiungere la sua directory principale.


3

A tutti coloro che hanno ancora questo problema. Credo che Pycharm si confonda con le importazioni. Per me, quando scrivo "dallo spazio dei nomi importa qualcosa", la riga precedente viene sottolineata in rosso, segnalando che c'è un errore, ma funziona. Tuttavia '' da .namespace importa qualcosa 'non viene sottolineato, ma non funziona.

Provare

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
Il primo è la sintassi di Python 2, il secondo è Python 3.
Tanya Branagan,

2

Risolto il problema scrivendo print (sys.path)e ho scoperto che python utilizzava pacchetti obsoleti nonostante l'installazione pulita. L'eliminazione di questi python creati utilizza automaticamente i pacchetti corretti.


2

Nel mio caso, perché sto usando PyCharm e PyCharm creano un 'venv' per ogni progetto nella cartella del progetto, ma è solo un mini env di Python. Sebbene tu abbia installato le librerie di cui hai bisogno in Python, ma nel tuo progetto personalizzato 'venv', non è disponibile. Questo è il vero motivo di "ImportError: nessun modulo chiamato xxxxxx" si è verificato in PyCharm. Per risolvere questo problema, è necessario aggiungere librerie all'ambiente personalizzato del progetto attenendosi alla seguente procedura:

  • In PyCharm, dal menu 'File' -> Impostazioni
  • Nella finestra di dialogo Impostazioni, Progetto: XXXProject-> Interprete di progetto
  • Fai clic sul pulsante "Aggiungi", ti mostrerà la finestra di dialogo "Pacchetti disponibili"
  • Cerca nella tua libreria, fai clic su "Installa pacchetto"
  • Quindi, tutto il pacchetto necessario verrà installato nella cartella 'venv' personalizzata del progetto.

Finestra di dialogo delle impostazioni

Godere.


0

Dopo aver subito lo stesso problema, ho scoperto che la mia risoluzione era eliminare tutto pyc file dal mio progetto, sembra che questi file memorizzati nella cache stiano causando in qualche modo questo errore.

Il modo più semplice che ho trovato per farlo è stato spostarmi nella cartella del mio progetto in Windows Explorer e cercare *.pyc, quindi selezionare tutto ( Ctrl+ A) ed eliminarli ( Ctrl+X ).

È possibile che avrei potuto risolvere i miei problemi semplicemente cancellando il pycfile specifico ma non l'ho mai provato


0

Ho affrontato lo stesso problema: Import error. Inoltre, la libreria è stata installata correttamente al 100%. La fonte del problema era che sul mio PC sono state installate versioni di Python 3 (pacchetto anaconda). Questo è il motivo per cui la libreria è stata installata no nel posto giusto. Successivamente ho appena cambiato la versione corretta di Python nel mio IDE PyCharm.


0

Ho avuto lo stesso errore. È stato causato da qualcuno che ha creato una cartella nella stessa cartella del mio script, il cui nome era in conflitto con un modulo che stavo importando da altrove. Invece di importare il modulo esterno, sembrava all'interno di questa cartella che ovviamente non conteneva i moduli previsti.


0

Ho avuto lo stesso problema (Python 2.7 Linux), ho trovato la soluzione e vorrei condividerla. Nel mio caso avevo la struttura seguente:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

In "main.py" avevo provato senza successo tutte le combinazioni qui sotto:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

La soluzione è stata molto più semplice di quanto pensassi. Ho rinominato la cartella "Opuscolo" in "opuscolo" e il gioco è fatto. Ora Python può importare normalmente la classe Question usando in 'main.py' il codice:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Da ciò posso concludere che Package-Names (cartelle) come 'booklet' deve iniziare da lettere minuscole, altrimenti Python lo confonde con nomi di classe e nomi di file.

Apparentemente, questo non era il tuo problema, ma la risposta di John Fouhy è molto buona e questa discussione ha quasi tutto ciò che può causare questo problema. Quindi, questa è un'altra cosa e spero che questo possa aiutare gli altri.


0

Nel mio caso stavo includendo il percorso della cartella package.egg piuttosto che il pacchetto reale sottostante. Ho copiato il pacchetto al massimo livello e ha funzionato.


0

Questo ha funzionato per me: __init__.pyfile creato nella cartella principale (nel tuo caso, all'interno della site-packagescartella). E importato in questo modo:

from site-packages.toolkit.interface import interface

Spero che sia utile anche per te!


0

Nel server Linux provare dos2unix script_name

(rimuovi tutti i file (se presenti) pyccon comando find . -name '*.pyc' -delete)

e riesegui nel caso se hai lavorato su script su Windows


0

Nel mio caso, stavo usando sys.path.insert()per importare un modulo locale e stavo ottenendo module not foundda una libreria diversa. Ho dovuto mettere sys.path.insert()sotto le importazioni riportate module not found. Immagino che la migliore pratica sia quella di mettere sys.path.insert()in fondo le tue importazioni.

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.