Distribuir una aplicación Python
-
19-09-2019 - |
Pregunta
Tengo una aplicación Python simple donde mi estructura de directorios es la siguiente:
- proyecto/
- principal.py
- configuración.py
- complementos/
- complemento1
- complemento2
- ...
Config.py solo carga archivos de configuración, no contiene ninguna información de configuración en sí mismo.
Ahora quiero distribuir este programa y pensé en usar herramientas de configuración para hacerlo.El archivo que se espera que utilicen los usuarios es main.py, de modo que uno claramente vaya a /usr/bin y el resto de los archivos vayan a /usr/share/project.
Pero hay un problema:De alguna manera necesitaría decirle a main.py que busque config.py en el directorio compartido.Pero realmente no puedo estar seguro de dónde está exactamente el directorio compartido, ya que eso depende de las herramientas de configuración, ¿verdad?
¿Cuál es la mejor práctica al distribuir aplicaciones basadas en Python?
Solución
setuptools instalar el paquete en una ubicación que es accesible desde pitón es decir, se puede importar:
import project
el aumento problema cuando se hace la importación relativos en lugar de importaciones en términos absolutos. si sus importaciones main.py
config.py
funciona debido a que viven en el mismo directorio. cuando se mueve el main.py
a otra ubicación como /usr/bin
u otra ubicación actual en PATH variable de entorno, pitón tratar de importar config.py
de sys.path
y no de su dir paquete. la solución es utilizar importación absoluta:
from project import config
ahora main.py
es "móvil".
otra solución, que yo prefiero, está utilizando la creación de la escritura automática ofrecido por setuptools .
en lugar de tener su código en un
if __name__ == "__main__":
# here all your beautiful code
declaración, ponga su código en una función (principal podría ser un buen nombre):
def main():
# put your code here
if __name__ == "__main__": # not needed, just in case...
main()
Ahora modificar setup.py
:
setup(
# ...
entry_points = {
"console_scripts": [
# modify script_name with the name you want use from shell
# $ script_name [params]
"script_name = project.main:main",
],
}
)
eso es todo. después de una instalación setuptools crear un guión envoltorio que es exigible a partir de concha y que llama a su función principal. Ahora main.py
puede vivir en el directorio del proyecto y que no necesita más para moverse en un directorio bin/
. en cuenta que setuptools pone automáticamente este script en el directorio bin/
en relación con el prefijo de instalación.
es.
python setup.py install --prefix ~/.local
instalar el paquete de proyectos en
~/.local/lib/python<version>/site-packages/<package_name>
y su secuencia de comandos en
~/.local/bin/<script_name>
así que asegúrese de que ~/.local/bin
está presente en su PATH env.
más información en: http://peak.telecommunity.com/DevCenter / setuptools #-script-creación automática