"ImportError: nessun modulo denominato" quando si tenta di eseguire lo script Python


144

Sto cercando di eseguire uno script che lancia, tra le altre cose, uno script Python. Ottengo un ImportError: nessun modulo chiamato ... tuttavia, se avvio ipython e importo lo stesso modulo nello stesso modo attraverso l'interprete, il modulo viene accettato.

Cosa sta succedendo e come posso ripararlo? Ho provato a capire come Python usa PYTHONPATH ma sono completamente confuso. Qualsiasi aiuto sarebbe molto apprezzato.


4
Devi fornire maggiori informazioni. Quando dici "esegui uno script", intendi uno script di shell? Quale modulo non puoi importare? Dove si trova quel modulo? Dove si trova la tua sceneggiatura?
BrenBarn,

2
Se vuoi una risposta definitiva a "cosa sta succedendo", avvia python con l' -vopzione e vedrai dove python sta (o non trova) i moduli che importi.
Errore fatale

Cosa stai cercando di importare? I due script Python sono nella stessa directory?
pynovice,

2
Forniscici il codice che stai eseguendo, il testo completo della traccia dello stack e i passaggi esatti che stai eseguendo per produrre l'errore. È piuttosto difficile aiutare quando non sappiamo quale sia esattamente il problema.
MattDMo

5
Immagino sia un problema che molti utenti sperimentano, anche a 4 anni dalla prima domanda.
CodeOcelot,

Risposte:


183

Questo problema sorge a causa dei modi in cui l'interprete IPython della riga di comando utilizza il percorso corrente rispetto al modo in cui un processo separato fa (sia esso un notebook IPython, un processo esterno, ecc.). IPython cercherà i moduli da importare che non si trovano solo nel tuo sys.path, ma anche nella tua directory di lavoro corrente. Quando si avvia un interprete dalla riga di comando, la directory corrente in cui si sta operando è la stessa in cui è stato avviato ipython. Se si esegue

import os
os.getcwd() 

vedrai che è vero.

Tuttavia, supponiamo che tu stia utilizzando un notebook ipython, esegui os.getcwd()e la tua directory di lavoro corrente è invece la cartella in cui hai detto al notebook di operare nel tuo file ipython_notebook_config.py (in genere utilizzando l' c.NotebookManager.notebook_dirimpostazione).

La soluzione è fornire all'interprete Python il percorso del modulo. La soluzione più semplice è aggiungere quel percorso all'elenco sys.path. Nel tuo taccuino, prova innanzitutto:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

Se ciò non funziona, hai un problema diverso tra le mani non correlato al percorso di importazione e dovresti fornire maggiori informazioni sul problema.

Il modo migliore (e più permanente) per risolvere questo problema è impostare PYTHONPATH , che fornisce all'interprete directory aggiuntive in cui cercare pacchetti / moduli python. La modifica o l'impostazione di PYTHONPATH come var globale dipende dal sistema operativo ed è discussa in dettaglio qui per Unix o Windows .


1
PSA: se sei arrivato a questa domanda SO perché stai ricevendo questo errore in jupyter-notebook, vedi sotto, stackoverflow.com/a/27944947/127971 Sfortunatamente, la domanda non è abbastanza specifica per una singola risposta.
michael

@michael quella risposta riguarda l'importazione di moduli Python nel caso generale; il file dunder init.py è necessario quando l'interprete cerca nelle directory i moduli da importare, notebook o meno. La risposta sopra sulla directory di lavoro dell'interprete per notebook e l'impostazione di PYTHONPATH è corretta.
BoltzmannBrain,

Ho detto che ci sarebbero state risposte multiple multiple, a causa della formulazione della domanda. Non sto insinuando che questa risposta non sia corretta. Ma se usi jupyter-notebook, toccherai il file __init_.py, giusto? ... e, non vorrai modificare PYTHONPATHné chiamare sys.path.append, anche se sono anche corretti (giusto?). Voglio dire, ho dozzine di directory con codice e non le aggiungerò tutte al percorso, né mi aspetto che altri utenti facciano il loro file di configurazione jupyter, anche se si tratta di una directory.
michael

16

Basta creare un file Python vuoto con il nome __init__.pynella cartella che mostra l'errore, mentre si esegue il progetto Python.


1
Con " init.py " intendi "_ init_ .py", giusto? Ho creato _ init_ .py come file vuoto e ha funzionato per me. Molte grazie. Ma perché è necessario? Prima avevo uno script Python nella stessa directory del mio notebook IPython e l'importazione funzionava bene.
Eduardo Reis,

3
effettivamente init .py è usato per indicare python per indicare che c'è un pacchetto contenente in quella posizione corrispondente. solo allora troverà i sottomoduli qualunque cosa tu abbia creato sotto di esso. se non si crea ' init .py' significa che Python non sa che c'è qualche pacchetto in esso. Ad esempio: da "Myfolder.Mypackage import Mymodules" per questo ad esempio, è necessario avviare init .py per indicare Python per dire che c'è un pacchetto qui. altrimenti non lo sa.
Mohideen bin Mohammed,

1
Sì, risposta perfetta. Questo è necessario in Python 2.7, ma nota nel 3
Agape Gal'lo

questo ha risolto il problema in python 3 per me.
Rick supporta Monica il

risolto il problema anche per me - usando jupyter notebook, con sorgente python nella sottodirectory del file ipynb; ad esempio, foo.ipynbusando bar/baz.py, aggiungi un bar/__init__.pyfile vuoto in modo che il notebook possa usarefrom bar.baz import MyClass
michael

13

Assicurarsi che entrambi stiano utilizzando lo stesso interprete. Questo mi è successo su Ubuntu:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

Ed sys.pathera diverso tra i due interpreti. Per risolverlo, ho rimosso Python 3.3.


avendo usato la miniconda per installare un sacco di cose relative a Python, ho avuto esattamente questo problema. Ubuntu Python 2.7 in bundle è diverso dalla Miniconda Python 2.7. Questa risposta mi ha permesso di risolvere il problema
bph

4
Questo era il mio problema Ho eseguito l'aggiornamento a Python 2.7.11 ma la mia shell interattiva iPython utilizzava ancora la 2.7.5. Ho solo bisogno di correre pip install --upgrade ipythonper ottenere la versione più recente e quindi ha usato automaticamente 2.7.11 per impostazione predefinita.
Abbondanza10

Il mio IPython è 7.4.0 mentre non esiste alcuna versione di Python.
aderchox,

@aderchox Esegui questo in ipython per ottenere la versione dell'interprete:import sys; sys.version
z0r

7

Il motivo principale è che i percorsi sys. di Python e IPython sono diversi.

Fare riferimento al collegamento lucypark , la soluzione funziona nel mio caso. Succede quando si installa opencv di

conda install opencv

E ho ottenuto un errore di importazione in iPython, ci sono tre passaggi per risolvere questo problema:

import cv2
ImportError: ...

1. Controlla il percorso in Python e iPython con il seguente comando

import sys
sys.path

Troverai risultati diversi da Python e Jupyter. Secondo passaggio, basta usare sys.path.append per correggere il percorso perso con prova ed errore.

2. Soluzione temporanea

In iPython:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

il ImportError:..problema è stato risolto

3. Soluzione permanente

Crea un profilo iPython e imposta l'appendice iniziale:

In bash shell:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

In vi, aggiungi al file:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

FATTO


'profilo ipython creare' .... Sì! Questa è l'unica soluzione (permanente) che risolve il problema del notebook jupyter che non legge dall'ambiente PATH e PYTHONPATH ... senza ricorrere alle dichiarazioni disordinate di sys.path all'inizio di ogni file (yuk). grazie @jesse.
JohnL_10

6

Funzionerà sys.path.append('my-path-to-module-folder'), ma per evitare di farlo in IPython ogni volta che si desidera utilizzare il modulo, è possibile aggiungere export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"al proprio ~/.bash_profilefile.


2

Prima di installare ipython, ho installato i moduli tramite easy_install; dire sudo easy_install mechanize.

Dopo aver installato ipython, ho dovuto rieseguire easy_install affinché ipython riconoscesse i moduli.


2

Ho avuto un problema simile, risolto chiamando python3invece che python, i miei moduli erano in Python3.5.


2

Se lo stai eseguendo dalla riga di comando, a volte l'interprete di Python non è a conoscenza del percorso in cui cercare i moduli.

Di seguito è riportata la struttura delle directory del mio progetto:

/project/apps/..
/project/tests/..

Stavo correndo sotto il comando:

>> cd project

>> python tests/my_test.py

Dopo aver eseguito sopra il comando sono arrivato sotto l'errore

no module named lib

lib è stata importata in my_test.py

ho stampato sys.path e ho capito che il percorso del progetto a cui sto lavorando non è disponibile nell'elenco sys.path

ho aggiunto sotto il codice all'inizio del mio script my_test.py.

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

Non sono sicuro che sia un buon modo di risolverlo, ma sì, ha funzionato per me.


Funzionerà se esegui sempre lo script dalla stessa posizione. In caso contrario, si verificheranno problemi poiché os.getcwd()ottiene la directory in cui è stato eseguito lo script, non la directory in cui risiede il file di script.
Nathan Arthur,

1

Ecco come l'ho risolto:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)


0

Ho trovato un'altra fonte di questa discrepanza:

Ho installato ipython sia localmente che comunemente in virtualenvs. Il mio problema era che, all'interno di un virtualenv appena creato con ipython, veniva prelevato il sistema ipython, che era una versione diversa rispetto a python e ipython in virtualenv (un 2.7.x contro un 3.5.x), e ne seguiva l'ilarità.

Penso che la cosa intelligente da fare ogni volta che si installa qualcosa che disponga di un file binario yourvirtualenv/binsia eseguire immediatamente rehasho simili per qualsiasi shell che si sta utilizzando in modo da ottenere il python / ipython corretto. (Devo verificare se ci sono pipganci post-installazione adatti ...)


0

Soluzione senza script:

  1. Apri Spyder -> Strumenti -> gestore PYTHONPATH
  2. Aggiungi percorsi Python facendo clic su "Aggiungi percorso". Ad esempio: "C: \ Users \ Utente \ AppData \ Local \ Programmi \ Python \ Python37 \ Lib \ site-pacchetti"
  3. Fai clic su "Sincronizza ..." per consentire ad altri programmi (ad es. Jupyter Notebook) di usare i pythonpaths impostati nel passaggio 2.
  4. Riavvia Jupyter se è aperto

0

Ciò è probabilmente causato da diverse versioni di Python installate sul tuo sistema , ad esempio python2 o python3 .

Esegui il comando $ pip --versione $ pip3 --versionper verificare da quale pip proviene su Python 3x . Ad esempio, dovresti vedere le informazioni sulla versione come di seguito:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Quindi eseguire lo example.pyscript con il comando seguente

$ python3 example.py

0

Mi è successo con la directory utils. Stavo cercando di importare questa directory come:

from utils import somefile

utilsè già un pacchetto in Python. Basta cambiare il nome della directory in qualcosa di diverso e dovrebbe funzionare bene.


0

Questo tipo di errori si verifica molto probabilmente a causa di conflitti con la versione di Python. Ad esempio, se la tua applicazione funziona solo su Python 3 e hai anche Python 2, allora è meglio specificare quale versione usare. Ad esempio usare

python3 .....

invece di

python

0

Questa risposta si applica a questa domanda se

  1. Non vuoi cambiare il tuo codice
  2. Non vuoi cambiare PYTHONPATH in modo permanente

Modifica temporaneamente PYTHONPATH

il percorso seguente può essere relativo

PYTHONPATH=/path/to/dir python script.py

0

import sys sys.path.append ('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') import ta


-1

Rimuovere pathlibe reinstallare. Elimina il pathlib nella sitepackagescartella e reinstalla il pacchetto pathlib usando il comando pip:

pip install pathlib
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.