"ImportError: ningún módulo llamado" al intentar ejecutar el script Python

144

Estoy tratando de ejecutar un script que inicie, entre otras cosas, un script de Python. Me sale un ImportError: ningún módulo llamado ..., sin embargo, si inicio ipython e importo el mismo módulo de la misma manera a través del intérprete, el módulo es aceptado.

¿Qué está pasando y cómo puedo solucionarlo? Intenté entender cómo Python usa PYTHONPATH, pero estoy completamente confundido. Cualquier ayuda sería muy apreciada.

CodeOcelot
fuente
44
Necesitas dar más información. Cuando dices "ejecutar un script", ¿te refieres a un script de shell? ¿Qué módulo es el que no puedes importar? ¿Dónde se encuentra ese módulo? ¿Dónde se encuentra tu guión?
BrenBarn
2
Si desea una respuesta definitiva a "lo que está sucediendo", inicie python con la -vopción y verá dónde está (o no) python encontrando los módulos que importa.
FatalError
¿Qué intentas importar? ¿Están los dos scripts de Python en el mismo directorio?
pynovice
2
Indíquenos el código que está ejecutando, el texto completo del seguimiento de la pila y los pasos exactos que está realizando para generar el error. Es bastante difícil ayudar cuando no sabemos cuál es el problema exacto.
MattDMo
55
Supongo que es un problema que muchos usuarios experimentan, incluso 4 años después de la primera pregunta.
CodeOcelot

Respuestas:

183

Este problema surge debido a las formas en que el intérprete de IPython de línea de comandos usa su ruta actual frente a la forma en que lo hace un proceso separado (ya sea un cuaderno de IPython, proceso externo, etc.). IPython buscará módulos para importar que no solo se encuentren en su sys.path, sino también en su directorio de trabajo actual. Al iniciar un intérprete desde la línea de comandos, el directorio actual en el que está operando es el mismo en el que inició ipython. Si ejecuta

import os
os.getcwd() 

Verás que esto es cierto.

Sin embargo, supongamos que está utilizando una computadora portátil ipython, ejecute os.getcwd()y su directorio de trabajo actual es, en cambio, la carpeta en la que le indicó a la computadora portátil que opere en su archivo ipython_notebook_config.py (generalmente usando la c.NotebookManager.notebook_dirconfiguración).

La solución es proporcionar al intérprete de Python la ruta a su módulo. La solución más simple es agregar esa ruta a su lista sys.path. En su cuaderno, primero intente:

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

import module-of-interest

Si eso no funciona, tiene un problema diferente en sus manos no relacionado con la ruta de importación y debe proporcionar más información sobre su problema.

La mejor manera (y más permanente) de resolver esto es establecer su PYTHONPATH , que proporciona al intérprete directorios adicionales para buscar paquetes / módulos de Python. La edición o configuración de PYTHONPATH como una variable global depende del sistema operativo , y se trata en detalle aquí para Unix o Windows .

tyleha
fuente
1
PSA: si ha llegado a esta pregunta SO porque obtiene este error en jupyter-notebook, consulte a continuación, stackoverflow.com/a/27944947/127971 Desafortunadamente, la pregunta no es lo suficientemente específica para una sola respuesta.
michael
@michael esa respuesta se trata de importar módulos de Python en el caso general; el archivo dunder init.py es necesario cuando el intérprete busca en los directorios módulos para importar, notebook o no. La respuesta anterior sobre el directorio de trabajo del intérprete del cuaderno y la configuración de PYTHONPATH es correcta.
BoltzmannBrain
Dije que habría múltiples respuestas correctas, debido a la redacción de la pregunta. No estoy implicando que esta respuesta no sea correcta. Pero si usa jupyter-notebook, solo va a tocar el archivo __init_.py, ¿verdad? ... y, no va a querer modificar PYTHONPATHni llamar sys.path.append, incluso si también son correctos (¿correcto?). Quiero decir, tengo docenas de directorios con código en ellos, y no los agregaré todos a la ruta, ni esperaré que otros usuarios accedan a su archivo de configuración de jupyter, incluso si es un directorio.
michael
16

Simplemente cree un archivo Python vacío con el nombre __init__.pydebajo de la carpeta que muestra el error, mientras ejecuta el proyecto Python.

Mohideen bin Mohammed
fuente
1
Por ' init.py ' quieres decir '_ init_ .py', ¿verdad? Creé el _ init_ .py como un archivo vacío y funcionó para mí. Muchas gracias. ¿Pero por qué se necesita esto? Antes tenía un script de Python en el mismo directorio que mi cuaderno de ipython y la importación funcionaba bien.
Eduardo Reis
3
en realidad init .py se usa para indicar python para indicar que hay algún paquete que contiene en esa ubicación correspondiente. entonces solo encontrará submódulos, sea lo que sea que hayas creado debajo. si no crea ' init .py' significa que Python no sabe que hay algún paquete en él. Por ejemplo: desde "Myfolder.Mypackage import Mymodules" para esto, por ejemplo, debe iniciar init .py para indicar python para indicar que hay algún paquete aquí. De lo contrario, no lo sé.
Mohideen bin Mohammed
1
Sí, respuesta perfecta. Eso es necesario en Python 2.7, pero tenga en cuenta en el 3
Agape Gal'lo
Esto solucionó el problema en Python 3 para mí.
Rick apoya a Mónica el
también solucionó el problema para mí: usar jupyter notebook, con fuente de python en el subdirectorio del archivo ipynb; por ejemplo, foo.ipynbusando bar/baz.py, agregue un bar/__init__.pyarchivo vacío para que la computadora portátil pueda usarfrom bar.baz import MyClass
michael
13

Asegúrese de que ambos estén usando el mismo intérprete. Esto me sucedió en 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]

Y sys.pathfue diferente entre los dos intérpretes. Para solucionarlo, eliminé Python 3.3.

z0r
fuente
Después de haber usado Miniconda para instalar un montón de cosas relacionadas con Python, también obtuve exactamente este problema. El paquete ubuntu python 2.7 es diferente al miniconda python 2.7. Esta respuesta me permitió solucionar el problema
bph
44
Este fue mi problema. Me había actualizado a Python 2.7.11 pero mi shell interactivo iPython todavía estaba usando 2.7.5. Solo necesitaba correr pip install --upgrade ipythonpara obtener la última versión y luego usó automáticamente 2.7.11 por defecto.
Abundnce10
Mi IPython es 7.4.0, mientras que no existe tal versión de Python.
aderchox
@aderchox Ejecute esto en ipython para obtener la versión del intérprete:import sys; sys.version
z0r
7

La razón principal es que los sys.paths de Python e IPython son diferentes.

Consulte el enlace lucypark , la solución funciona en mi caso. Sucede cuando instala opencv por

conda install opencv

Y obtuve un error de importación en iPython. Hay tres pasos para resolver este problema:

import cv2
ImportError: ...

1. Verifique la ruta en Python y iPython con el siguiente comando

import sys
sys.path

Encontrará resultados diferentes de Python y Jupyter. Segundo paso, solo utilícelo sys.path.append para corregir la ruta perdida por prueba y error.

2. Solución temporal

En iPython:

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

el ImportError:..problema resuelto

3. Solución permanente

Cree un perfil de iPython y configure el apéndice inicial:

En 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

En vi, agregue al archivo:

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

HECHO

Jesse
fuente
'ipython profile create' .... ¡Sí! Esta es la única solución (permanente) que aborda el cuaderno jupyter que no lee del entorno PATH y PYTHONPATH ... sin recurrir a declaraciones sys.path desordenadas al comienzo de cada archivo (yuk). gracias @jesse
JohnL_10
6

Hacerlo sys.path.append('my-path-to-module-folder')funcionará, pero para evitar tener que hacer esto en IPython cada vez que quiera usar el módulo, puede agregarlo export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"a su ~/.bash_profilearchivo.

acannon828
fuente
2

Antes de instalar ipython, instalé módulos a través de easy_install; decirsudo easy_install mechanize .

Después de instalar ipython, tuve que volver a ejecutar easy_install para que ipython reconozca los módulos.

pandorabob
fuente
2

Tuve un problema similar, lo solucioné llamando en python3lugar de python, mis módulos estaban en Python3.5.

Peter n
fuente
2

Si lo está ejecutando desde la línea de comandos, a veces el intérprete de Python no conoce la ruta donde buscar los módulos.

A continuación se muestra la estructura de directorios de mi proyecto:

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

Estaba ejecutando debajo del comando:

>> cd project

>> python tests/my_test.py

Después de ejecutar el comando anterior, obtuve el siguiente error

no module named lib

lib fue importado en my_test.py

imprimí sys.path y descubrí que la ruta del proyecto en el que estoy trabajando no está disponible en la lista sys.path

Agregué el siguiente código al comienzo de mi 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)

No estoy seguro de si es una buena forma de resolverlo, pero sí funcionó para mí.

Raghav salotra
fuente
Esto funcionará si siempre ejecuta el script desde la misma ubicación. De lo contrario, se encontrará con problemas ya que os.getcwd()obtiene el directorio donde se ejecutó el script, no el directorio donde vive el archivo de script.
Nathan Arthur
1

Así es como lo arreglé:

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

Encontré otra fuente de esta discrepancia:

He instalado ipython tanto localmente como comúnmente en virtualenvs. Mi problema fue que, dentro de un virtualenv recién creado con ipython, se recogió el sistema ipython, que era una versión diferente a la de python e ipython en virtualenv (un 2.7.x frente a un 3.5.x), y se produjo hilaridad.

Creo que lo más inteligente cuando se instala algo que tendrá un binario yourvirtualenv/bines ejecutar de inmediato rehasho similar para cualquier shell que esté utilizando para que se elija el python / ipython correcto. (Tengo que comprobar si hay pipganchos adecuados después de la instalación ...)

kaleissin
fuente
0

Solución sin scripting:

  1. Abra Spyder -> Herramientas -> Administrador PYTHONPATH
  2. Agregue rutas de Python haciendo clic en "Agregar ruta". Por ejemplo: 'C: \ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-packages'
  3. Haga clic en "Sincronizar ..." para permitir que otros programas (por ejemplo, Jupyter Notebook) usen los pythonpaths establecidos en el paso 2.
  4. Reinicia Jupyter si está abierto
Wen
fuente
0

Esto probablemente sea causado por diferentes versiones de python instaladas en su sistema , es decir, python2 o python3 .

Ejecute el comando $ pip --versiony $ pip3 --versioncompruebe de qué pip proviene Python 3x . Por ejemplo, debería ver la información de la versión como a continuación:

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

Luego ejecute el example.pyscript con el siguiente comando

$ python3 example.py
shizhen
fuente
0

Me pasó con el directorio utils. Intenté importar este directorio como:

from utils import somefile

utilsya es un paquete en python. Simplemente cambie el nombre de su directorio a algo diferente y debería funcionar bien.

subtleseeker
fuente
0

Este tipo de errores ocurre probablemente debido a conflictos de versión de Python. Por ejemplo, si su aplicación se ejecuta solo en Python 3 y también obtuvo Python 2, entonces es mejor especificar qué versión usar. Por ejemplo uso

python3 .....

en vez de

python
Nu-ONE
fuente
0

Esta respuesta se aplica a esta pregunta si

  1. No quieres cambiar tu código
  2. No quieres cambiar PYTHONPATH permanentemente

Modificar temporalmente la RUTA DEL PITÓN

camino a continuación puede ser relativo

PYTHONPATH=/path/to/dir python script.py
kon psych
fuente
0

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

shiva kumar
fuente
-1

Retire pathliby vuelva a instalarlo. Elimine el pathlib en la sitepackagescarpeta y reinstale el paquete pathlib utilizando el comando pip:

pip install pathlib
usuario3233042
fuente