non - python relative import
Python importa la ruta relativa (3)
Tengo un proyecto en el que me gustaría usar algunas clases de Python ubicadas en otros directorios.
Estructura de ejemplo:
/dir
+../subdirA
+../subdirB
+../mydir
La ruta absoluta varía, porque este proyecto se ejecuta en diferentes máquinas.
Cuando se ejecuta mi archivo python con MySampleClass ubicado en / mydir , ¿cómo importo OtherClassRoot ubicado en / dir o OtherClassA ubicado en / subdirA ?
Intenté cosas como:
from . import MySampleClass as msc
o
from ../ import MySampleClass as msc
pero esto siempre falla o me da mensajes de error como Intento de importación relativa en paquetes no
Entonces, ¿cuál es la forma correcta de importar relativamente archivos Python?
Cualquier comentario es muy apreciado :)
En la estructura dir de la siguiente manera:
/dir
+../subdirA
+../subdirB
+../mydir
Combinando con linux command ln
, podemos simplificar las cosas:
1. cd dir/mydir
2. ln -s ../subdirA ./
3. ln -s ../subdirB ./
Y, ahora, si desea importar some_stuff
del archivo: dir/subdirA/fileA.py
en su archivo: dir/mydir/myfile.py
, simplemente importe de esta manera:
from subdirA.fileA import some_stuff
Y, lo mismo se aplica a ''dir / subdirB''
Lo que es más, esto funciona para el proceso setup.py
, :)
primero agregue las rutas relativas a la ruta de acceso de los pitones
import os
import sys
cwd = os.getcwd()
sys.path.append(cwd + ''/../subdirA/'')
sys.path.append(cwd + ''/../subdirB/'')
luego importa los módulos.
Necesitará un __init__.py
en el directorio mydir (y puede estar vacío), luego, siempre que dir esté en la ruta sys, suponiendo que MySampleClass está en myfile.py y myfile.py está en mydir
from mydir.myfile import MySampleClass
Si desea importar funciones de nivel superior desde un archivo llamado util.py que reside en subdirA en myfile.py (donde está su clase), entonces __init__.py
debe estar en subdirA y luego en miarchivo.py
from subdirA.util import somefunc, someotherfunc
Lo mismo es cierto para la ruta sys, es decir, debe comenzar desde ''dir'' o agregarlo. Todo se importa desde el nivel superior del paquete (generalmente su carpeta de proyecto).
Sin embargo, para las pruebas de módulo, donde puede ejecutar una función de utilidad en el intérprete, si comienza desde subdirA, necesitará agregar dir a la ruta del sistema, para que sus importaciones puedan resolverse.
>>> import sys
>>> sys.path.append(''../dir'')
pero esto es un truco y sería preferible utilizarlo solo por el intérprete cuando esté realizando la prueba. También puede agregar ''dir'' a sus paquetes de sitio en un archivo pth.
Para usar importaciones relativas, necesitaría una carpeta anidada más profunda, como subdirA / subdirofA, luego en subdirectorA, podría usarla. para retroceder (como from .subdirB
). Realmente, para mí, las importaciones relativas son algo difíciles de ver. Es mejor para mí usar las importaciones directas en relación con el directorio del proyecto , pero podría ver que son útiles si quieres anidar un subconjunto ingenuo, pero una vez más, es mejor ser explícito que implícito si es posible.
también vea esto