Error de PyCharm: 'Sin módulo' al intentar importar su propio módulo (script de Python)

160

He escrito un módulo (un archivo my_mod.pyque reside en la carpeta my_module). Actualmente, estoy trabajando en el archivo cool_script.pyque reside en la carpeta cur_proj. He abierto la carpeta en PyCharm usando File - open (y supongo, por lo tanto, es un proyecto de PyCharm).

En ProjectView (CMD-7), puedo ver mi proyecto cur_proj(en rojo) y en "Bibliotecas externas" sí veo my_module. En cool_script.py, puedo escribir

from my_module import my_mod as mm

y PyCharm incluso hace sugerencias para my_mod. Hasta aquí todo bien.

Sin embargo, cuando intento ejecutar cool_script.py, PyCharm me dice "Ningún módulo llamado my_module"

Esto me parece extraño, porque

A) en el terminal (OS 10.10.2), en python, puedo importar el módulo sin problemas: hay una entrada correspondiente en PYTHONPATH en .bashrc

B) en PyCharm - Configuración - Proyecto cur_proj - Intérprete de proyecto - CogWheel junto al intérprete de Python - más - mostrar rutas para el icono de intérprete seleccionado, las rutas de PYTHONPATH aparecen (como creo que deberían)

Por lo tanto, ¿por qué recibo el error cuando intento ejecutar cool_script.py? - ¿Qué me estoy perdiendo?

Notas:

Anexo 2015-Feb-25

Cuando en PyCharm para ejecutar - Editar configuraciones, para mi proyecto actual, hay dos opciones que se seleccionan con una marca de verificación: " Agregar raíces de contenido a PYTHONPATH " y " Agregar raíces de origen a PYTHONPATH ". Cuando tengo ambos desmarcados, puedo cargar mi módulo.

Entonces funciona ahora, pero ¿por qué ?

Surgieron otras preguntas:

  • ¿Qué son las "raíces de contenido" y qué son las "raíces de origen"? ¿Y por qué agregar algo al PYTHONPATH hace que de alguna manera se rompa?
  • ¿Debo desmarcar ambas opciones todo el tiempo (también en los valores predeterminados, no solo en las configuraciones específicas del proyecto (panel izquierdo del cuadro de diálogo Ejecutar / Depurar configuraciones)?
Claus
fuente
2
Es posible que ya haya intentado esto, pero al importar módulos de otros paquetes, incluya packagename from foldername.mymodule import mymethod. Otra cosa que he tenido que hacer es agregar la carpeta vacía _init .py en todas las carpetas que usaría para acceder a su módulo, por lo que en caso de from parentfolder.childfolder.mymodule ...que necesite init en dos carpetas. Dependiendo de dónde se encuentren las carpetas entre sí, es posible que necesite un paquete de nivel superior sys.pathcomo se describe en esta respuesta
ziddarth
44
Yo también tuve tu problema. La siguiente publicación resolvió mis problemas: stackoverflow.com/questions/21236824/…
user3155053
¿Identificó por qué desmarcar esas casillas de verificación realmente funciona en lugar de marcarlas?
Nithish Inpursuit Ofhappiness
Lo que funcionó para mí es desmarcar Enable Django Supportla configuración Languages & Frameworks -> Djangoen la versión Pro de PyCharm. Estaba abriendo una consola de django que causó los problemas de importación.
Eric Blum

Respuestas:

324

Si su propio módulo está en la misma ruta, debe marcar la ruta como Sources Root. En el explorador de proyectos, haga clic derecho en el directorio que desea importar. Luego seleccione Mark Directory Asy seleccione Sources Root.

Espero que esto ayude.

Beatriz Fonseca
fuente
9
Esto funcionó para mí, pero también tuve que eliminar y volver a crear la configuración de ejecución que había creado anteriormente antes de marcar la carpeta como raíz de fuentes.
grinch
2
Y necesita agregar __init__.pypara hacer que Python trate los directorios como paquetes que contienen: stackoverflow.com/questions/448271/…
Beatriz Fonseca
¿Cómo harías esto si no estuvieras usando pycharm? Me encuentro exactamente con el mismo problema.
Boudewijn Aasman
@BeatrizFonseca Sí, lo hice. No pude hacerlo funcionar en sublime, pero instalé pycharm e intenté la respuesta aquí y funcionó perfectamente bien, por lo que debe tener algo que ver con especificar el directorio correcto como el paquete raíz.
Boudewijn Aasman
@BoudewijnAasman, puede intentar usar .antes del nombre del paquete para especificar que este paquete es local
Beatriz Fonseca
37

Entonces si vas a

-> Configuración -> Proyecto: Mi_proyecto -> Estructura del proyecto,

Solo el directorio en el que está disponible el código fuente y márquelo como "Fuentes" (puede verlo en la misma ventana). El directorio con el código fuente debe volverse azul. Ahora puede importar en módulos que residen en el mismo directorio.

JRD
fuente
3
Me doy cuenta de que esta es una publicación antigua pero funcionó para mí, gracias.
Mike - SMT
1
¡Encontré e ignoré la misma respuesta muchas veces, esta vez lo intenté y funciona!
A.Ametov
29

PyCharm Community / Professional 2018.2.1

Estaba teniendo este problema en este momento y pude resolverlo de una manera similar a la que señalaron @Beatriz Fonseca y @Julie.

Si va a File-> Settings-> Project: YourProjectName-> Project Structure, tendrá un diseño de directorio del proyecto en el que está trabajando actualmente. Deberá revisar sus directorios y etiquetarlos como el Sourcedirectorio de todos sus archivos de origen. , o como una Resourcecarpeta para archivos que son estrictamente para importar.

También querrá asegurarse de colocar los __init__.pyarchivos dentro de sus directorios de recursos, o realmente en cualquier lugar desde el que desee importar, y funcionará perfectamente bien.

Espero que esta respuesta ayude a alguien, y espero que JetBrains repare este molesto error.

Oleg Silkin
fuente
2
Esto no es específico de PyCharm Professional , sino que esta característica también está disponible en la edición de PyCharm Community . En la Estructura del proyecto, haga clic con el botón derecho en el directorio que contiene el módulo, luego seleccione Mark Directory asdel menú contextual y seleccione Sources Root.
Astitva Srivastava
1
¿Puede indicar cuál es el significado de esta raíz de fuentes? Aunque resolvió mi problema, no entendí por qué lo estoy haciendo.
user3341078
8

Lo que intenté es buscar la ubicación donde están mis archivos.

p.ej E:\git_projects\My_project\__init__.py is my location.

Fui a Archivo -> Configuración -> Proyecto: Mi_proyecto -> Estructura del proyecto y agregué la raíz de contenido al lugar de mención E:\git_projects\My_project

Funcionó para mí.

Virendra Patel
fuente
2
El origen de la carpeta en la Estructura del proyecto funcionó para mí. Gracias.
Microos
Gracias @Virendra Patel y @Microos. Mi proyecto pycharm está en /home/my_user/git_projects/this_git_project/this_pycharm_project/. Agregué /home/my_user/git_projects/this_git_project/como raíz de contenido y /home/my_user/git_projects/this_git_project/this_pycharm_project/como la única carpeta de origen y todo finalmente funcionó.
KLaz
3

my_modulees una carpeta, no un módulo y no puede importar una carpeta, intente moverse my_mod.pya la misma carpeta que cool_script.pyy luego haga import my_mod as mm. Esto se debe a que Python solo busca en el directorio actual y sys.path, por lo tanto, no lo encontrará a my_mod.pymenos que esté en el mismo directorio

O puede buscar aquí una respuesta que le indique cómo importar desde otros directorios.

En cuanto a sus otras preguntas, no sé, ya que no uso PyCharm.

Tom
fuente
Puede crear un init .py en una carpeta, el intérprete de python se leerá como paquete de python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca
3

También recibí el error "Agregar raíces de origen a PYTHONPATH". Mi problema era que tenía dos carpetas con el mismo nombre, como project/subproject1/thing/srcy project/subproject2/thing/srcy tuve ambos marcados como root fuente. Cuando cambié el nombre de una de las "thing"carpetas a "thing1"(cualquier nombre único), funcionó.

Tal vez si PyCharm agrega automáticamente las raíces de origen seleccionadas, no usa la ruta completa y, por lo tanto, mezcla carpetas con el mismo nombre.

RubberDuckRabbit
fuente
2

Esto puede ser causado cuando el intérprete de Python no puede encontrar su código. Debe mencionar explícitamente a Python para encontrar su código en esta ubicación.

Para hacerlo:

  • Ve a tu consola de Python
  • Agregar sys.path.extend(['your module location'])a la consola de Python.

En tu caso:

  • Ve a tu consola de Python,
  • Al principio, escriba el siguiente código:

    import sys
    sys.path.extend([my module URI location])
  • Una vez que haya escrito esta declaración, puede ejecutar el siguiente comando:

    from mymodule import functions
Shravan Shetty
fuente
Un poco feo para agregar el camino así, pero funcionó para mí.
Florian Blume
Pycharm debe hacer esto, automáticamente, al abrir una consola, debe incluir los comandos sys.path.extend para los directorios, incluidas las dependencias (otros proyectos) y los directorios que contienen el código fuente del presente proyecto. PERO NO LO HACE automáticamente
fabiob
2

El paso clave confuso que debe hacerse es recrear la configuración de ejecución para el archivo fuente que está intentando ejecutar, de modo que el IDE tome las nuevas rutas.

La forma en que realmente funcionó para mí fue ir a Ejecutar / Editar configuraciones ..., seleccionar la configuración para el archivo que está intentando ejecutar en el lado izquierdo, desmarcar la casilla "Agregar raíces de origen a PYTHONPATH", guardar, y luego regrese y marque la casilla y guarde. ENTONCES funcionaría.

tomchappell
fuente
Sorprendentemente, esto era lo que necesitaba, ¡a pesar de hacerlo Invalidate Cache/Restartdos veces!
Josh Friedlander
1

Las raíces de contenido son carpetas que contienen el código de su proyecto, mientras que las raíces de origen también se definen de la misma manera. La única diferencia que llegué a entender fue que el código en las raíces de origen se construye antes que el código en la raíz de contenido.

Desmarcarlos no afectaría el tiempo de ejecución hasta el punto en que no esté creando módulos separados en su paquete que estén conectados manualmente a Django. Eso significa que si alguno de sus archivos no contiene 'desde django import ...' o si alguna de las funciones no se llama a través de django, desmarcar estas 2 opciones resultará en un mal funcionamiento.

Actualización: el problema solo surge cuando se utiliza Virtual Environmanet y solo cuando se controla el proyecto a través del terminal proporcionado. Porque el terminal aún funciona a través del sistema predeterminado pyhtonpath y no a través del entorno virtual. mientras que el panel de control de python django funciona bien.

RA123
fuente
1

La solución para este problema sin tener que marcar el directorio como raíz de origen es editar las configuraciones de ejecución y, en Ejecución, seleccionar la opción "Redirigir entrada desde" y elegir la secuencia de comandos que desea ejecutar. Esto funciona porque luego se trata como si el script se ejecutara interactivamente en este directorio. Sin embargo, Python seguirá marcando el nombre del módulo con un error "ningún módulo llamado x":

Redireccionar entrada desde:

Cuando el intérprete ejecuta la declaración de importación, busca x.py en una lista de directorios reunidos de las siguientes fuentes:

  1. El directorio desde el que se ejecutó el script de entrada o el directorio actual si el intérprete se ejecuta de forma interactiva
  2. La lista de directorios contenidos en la variable de entorno PYTHONPATH, si está establecida.
  3. Una lista de directorios dependiente de la instalación configurada en el momento en que se instala Python, en mi caso usr / lib / python3.6 en Ubuntu.
PyFox
fuente
0

Pycharm 2017.1.1

  1. Haga clic en View->ToolBar&View->Tool Buttons
  2. En el panel izquierdo Projectestaría visible, haga clic derecho sobre él y presione Autoscroll to source y luego ejecute su código.

Esto funcionó para mí.

AB Abhi
fuente
0

ln -s. algunProyecto

Si tiene someDirectory / someProjectDir y dos archivos, file1.py y file2.py, y file1.py intenta importar con esta línea

desde algún archivo de importación ProjectProir2

No funcionará, incluso si ha designado someProjectDir como directorio de origen, e incluso si aparece en las preferencias, proyecto, menú de estructura del proyecto como raíz de contenido. La única forma en que funcionará es vinculando el proyecto como se muestra arriba (comando unix, funciona en mac, no estoy seguro de su uso o sintaxis para Windows). Parece que hay algún mecanismo en el que Pycharm hace esto automáticamente, ya sea en el pago desde el control de versión o agregando como raíz de contexto, ya que Pycharm creó el enlace suave en un proyecto dependiente. Por lo tanto, solo copiar lo mismo, aunque la extraña réplica del directorio es molesta y la necesidad es desconcertante. También en la dependencia donde se creó automáticamente, no se muestra como un nuevo directorio bajo control de versiones. Quizás la comparación de archivos .idea revelará más.

usuario10895922
fuente
-1

La respuesta que funcionó para mí fue lo que OP menciona en su actualización de 2015: desmarque estas dos casillas en su configuración de ejecución de Python:

  • "Agregar raíces de contenido a PYTHONPATH"
  • "Agregar raíces de origen a PYTHONPATH"

Ya tenía la configuración de ejecución configurada para usar el venv adecuado, por lo que PyCharm no realizó ningún trabajo adicional para agregar cosas a la ruta. En cambio, estaba causando errores.

bsberry
fuente