from example another python python-import

example - python import from parent directory



Empaquetado de pitón para importaciones relativas (3)

Primero que nada: lo siento, sé que ha habido muchas preguntas sobre importaciones relativas, pero simplemente no encontré una solución. Si es posible, me gustaría utilizar el siguiente diseño de directorio:

myClass/ __init__.py test/ demo.py benchmark.py specs.py src/ __init__.py myClass.py

Ahora mis preguntas son:

  • ¿Cómo importan los archivos de prueba dentro del paquete correctamente myClass.py?

  • ¿Cómo importaría el paquete desde el exterior, suponiendo que tome myClass como submódulo en libs / myClass o incluya / myClass?

Hasta el momento no he podido encontrar una solución elegante para esto. Por lo que entiendo la Decisión de Guido, debería ser posible hacerlo from ..src import myClass pero este error:

ValueError: Attempted relative import in non-package

Lo cual parece que no trata a myClass como paquetes. Leyendo los documentos :

Los archivos __init__.py son necesarios para que Python considere que los directorios contienen paquetes;

Parece que me falta algo que especifique dónde están los scripts del paquete, ¿debería usar .pth?


ValueError: Attempted relative import in non-package

Significa que intenta utilizar la importación relativa en el módulo que no es paquete. Su problema con el archivo que tiene esto from ... import instrucción, y no el archivo que está tratando de importar.

Por lo tanto, si realiza importaciones relativas en sus pruebas, por ejemplo, debe hacer que sus pruebas formen parte de su paquete. Esto significa

  1. Añadiendo __init__.py para probar /
  2. Ejecutarlos desde algún script externo, como nosetests

Si ejecuta algo como python myClass/test/demo.py , las importaciones relativas tampoco funcionarán, ya que está ejecutando el módulo de demostración no como paquete. Las importaciones relativas requieren que el módulo que las utiliza se importe solo como módulo de paquete, from myClass.test.demo import blabla , o con importación relativa.


¡Después de horas de búsqueda anoche encontré la respuesta a las importaciones relativas en Python! O una solución fácil por lo menos. La mejor manera de solucionar esto es hacer que los módulos se llamen desde otro módulo. Así que supongamos que quieres demo.py para importar myClass.py . En la carpeta myClass en la raíz de los myClass , necesitan un archivo que llame a los otros dos. Por lo que veo, el directorio de trabajo siempre se considera __main__ por lo que si prueba la importación desde demo.py con el script demo.py , recibirá ese error. Para ilustrar:

Jerarquía de carpetas:

myClass/ main.py #arbitrary name, can be anything test/ __init__.py demo.py src/ __init__.py myClass.py

myClass.py:

def randomMaths(x): a = x * 2 y = x * a return y

demo.py:

from ..src import myClass def printer(): print(myClass.randomMaths(42))

main.py:

import test.demo demo.printer()

Si ejecuta demo.py en el intérprete, generará un error, pero ejecutar main.py no lo hará. Es un poco intrincado, pero funciona: D


Intra-package-references describe cómo myClass desde test/* . Para importar el paquete desde el exterior, debe agregar su ruta a la variable de entorno PYTHONPATH antes de ejecutar la aplicación sys.path o a la lista sys.path en el código antes de importarlo.

Por qué from ..src import myClass falla: probablemente, src no es un paquete de Python, no se puede importar desde allí. Debe agregarlo a la ruta de Python como se describe arriba.