imports - ¿No deberían las importaciones ser absolutas por defecto en python27?
python import subdirectory (3)
"Absoluto" no significa el que crees que hace; en cambio, significa que se lleva a cabo el "habitual" procedimiento de resolución de paquetes: primero, busca en el directorio del paquete, luego en todos los elementos de sys.path; que incluye los elementos de PYTHONPATH.
Si realmente lo desea, puede usar herramientas como el módulo imp, pero recomendaría que no lo haga por algo como esto. Porque en general, nunca deberías tener que crear un módulo con el mismo nombre que uno en la distribución estándar de Python.
Imagina la estructura del directorio:
/ a/ __init__.py b.py c.py c.py
El archivo /a/b.py
ve así:
import c should_be_absolute = c
Todos los demás archivos (incluido __init__
) están vacíos.
Al ejecutar un script de prueba (usando Python 2.7):
import a.b
print a.b.should_be_absolute
con PYTHONPATH=/
de un directorio vacío (por lo que no se agrega nada a PYTHONPATH
del directorio actual) Recibo
<module ''a.c'' from ''/a/c.py''>
donde de acuerdo con PEP 328 y la declaración de import <> is always absolute
, esperaría:
<module ''c'' from ''/c.py''>
La salida es la esperada cuando /a/c.py
archivo /a/c.py
.
¿Qué me estoy perdiendo? Y si este es el comportamiento correcto, ¿cómo importar el módulo c
desde b
(en lugar de ac
)?
Actualizar:
Según la lista de correo de python dev , parece ser un error en la documentación. Las importaciones no son absolutas por defecto en Python27.
Si solo está agregando /
a su PYTHONPATH, entonces el orden de búsqueda aún podría estar buscando c
en el directorio actual. Sería mucho mejor si colocara todo en un paquete raíz y lo refiriera absolutamente:
/myPackage
a/
__init__.py
b.py
c.py
__init__.py
c.py
Y un PYTHONPATH como: export PYTHONPATH=/:$PYTHONPATH
Así que en tu ac
harías y de estos:
from myPackage import c
from myPackage.c import Foo
import myPackage.c
De esta manera, siempre es relativo a su paquete.
debe agregar from __future__ import absolute_import
o usar importlib.import_module(''c'')
en Python 2.7
Es predeterminado en Python 3.
Hubo un error en Python: __future__.py
y su documentación afirma que las importaciones absolutas se volvieron obligatorias en 2.7, pero no lo hicieron .