python - tutorial - the django project
Módulos de espacio de nombres compatibles con Python 2 y 3(usando pip) (3)
¿Cómo es posible crear múltiples módulos de Python que compartan el mismo espacio de nombres compatible con Python 2.7+ y 3.3+?
Llamemos a la test
espacio de nombres. Ahora quiero tener dos módulos separados llamados test.foo
y otro llamado test.bar
. Sin embargo, actualmente estoy desarrollando test.helloworld
que depende de ambos, test.foo
y test.bar
. Ambos están listados en el archivo Requirements.txt.
Los módulos test.foo
y test.bar
están utilizando actualmente la solución de Python 2 para los paquetes de espacio de nombres:
import pkg_resources
pkg_resources.declare_namespace(__name__)
Ejecutando el comando pip sugerido para el modo de desarrollo pip install -e .
se convierte en: ImportError: No module named ''test.helloworld''
mientras se está importando test.foo
o test.bar
está funcionando.
La solución de Python 3 para los paquetes de espacio de nombres son paquetes de espacio de nombres implícitos donde el paquete de espacio de nombres no tiene un archivo __init__.py
. Lamentablemente, esto no funciona para las versiones de Python 2.
¿Cómo puedo diseñar una solución para Python 2 y 3 (que me permita usar pip install -e .
)? La solución --egg
no me funciona porque ya está en desuso.
Desearía utilizar paquetes de espacio de nombres de estilo pkgutil.
Desde https://packaging.python.org/guides/packaging-namespace-packages/ :
Paquetes de espacio de nombres de estilo pkgutil
Python 2.3 introdujo el módulo pkgutil y la función extend_path. Esto se puede usar para declarar paquetes de espacio de nombres que deben ser compatibles con Python 2.3+ y Python 3. Este es el enfoque recomendado para el nivel más alto de compatibilidad.
Una tabla que enumera todas las formas posibles de tratar con los paquetes de espacio de nombres, y las formas en que trabajarían juntos: https://github.com/pypa/sample-namespace-packages/blob/master/table.md
Hace poco tuve un problema similar, donde tuve que instalar un paquete para Python 2 y 3. Terminé teniendo que descargar el código de GitHub, luego ejecuté setup.py llamando
sudo python setup.py install
y
sudo python3 setup.py install
Esto hace que se instale el paquete tanto para Python 2 como para 3, aunque el código en sí fue creado para Python 2. Esto me permite trabajar con el paquete, ya sea que use Python 2 o 3, sin ningún conflicto de espacio de nombres.
Vea la respuesta en una pregunta similar para obtener instrucciones completas que funcionan tanto en python 2 como en 3.
En resumen, setup.py
necesita tener un nombre único para cada módulo y una definición común de __init__.py
espacio de namespace_packages
además de __init__.py
declarando el espacio de nombres establecido en los __init__.py
espacio de namespace_packages
.
Si todavía tiene problemas, publique su setup.py
y __init__.py
para cada módulo.