M贸dulos de Python: Crear, importar y compartir

    Introducci贸n

    Los m贸dulos son la unidad organizativa de m谩s alto nivel en Python. Si est谩 al menos un poco familiarizado con Python, probablemente no solo haya usado m贸dulos listos, sino que tambi茅n haya creado algunos usted mismo. Entonces, 驴qu茅 es exactamente un m贸dulo? Los m贸dulos son unidades que almacenan c贸digo y datos, brindan reutilizaci贸n de c贸digo a proyectos de Python y tambi茅n son 煤tiles para particionar los espacios de nombres del sistema en paquetes independientes. Son independientes porque solo puede acceder a los atributos de un m贸dulo despu茅s de importarlo. Tambi茅n puede entenderlos como paquetes de nombres, que cuando se importan se convierten en atributos del objeto de m贸dulo importado. De hecho, cualquier archivo de Python con una extensi贸n .py representa un m贸dulo.

    En este art铆culo comenzamos desde los conceptos b谩sicos b谩sicos de la creaci贸n e importaci贸n de m贸dulos, hasta casos de uso de m贸dulos m谩s avanzados, hasta empaquetar y enviar sus m贸dulos a un repositorio de software Python “oficial”, estructurado respectivamente en tres partes: Creaci贸n de un m贸dulo, Uso de un m贸dulo y Enviar un paquete a PyPI.

    Crear un m贸dulo

    Los basicos

    Realmente no hay mucha filosof铆a en la creaci贸n de un m贸dulo Python ya que los archivos con un sufijo .py representan un m贸dulo. Aunque, no todos los archivos de Python est谩n dise帽ados para importarse como un m贸dulo. Los archivos de Python que se utilizan para ejecutarse como una aplicaci贸n de Python independiente (archivos de nivel superior) generalmente est谩n dise帽ados para ejecutarse como scripts y, al importarlos, se ejecutar铆an los comandos en el script.

    Los m贸dulos que est谩n dise帽ados para ser importados por otro c贸digo no ejecutar谩n ning煤n c贸digo, solo exponen sus nombres de nivel superior como atributos del objeto importado. Tambi茅n es posible dise帽ar m贸dulos Python de c贸digo de modo dual que podr铆an usarse tanto para importar como para ejecutar como un script de nivel superior.

    Si bien las reglas de creaci贸n de m贸dulos son bastante relajadas, hay una regla sobre el nombre de los m贸dulos. Dado que los nombres de archivo de los m贸dulos se convierten en nombres de variables en Python cuando se importan, no se permite nombrar m贸dulos con palabras reservadas de Python. Por ejemplo, se puede crear un m贸dulo for.py, pero no se puede importar porque “para” es una palabra reservada. Ilustremos lo que hemos mencionado hasta ahora en un “隆Hola mundo!” ejemplo.

    # Module file: my_module.py
    
    def hello_printer():
        print("Hello world!")
    
    name = "John"
    
    # Script file: my_script.py
    
    import my_module
    
    my_module.hello_printer()
    print("Creator:", my_module.name)
    

    ‘My_module.py’ est谩 dise帽ado como un m贸dulo cuyo c贸digo se puede importar y reutilizar en otros archivos de Python. Puedes ver eso por su contenido: no requiere ninguna acci贸n, solo define funciones y variables. Por el contrario, ‘my_script.py’ est谩 dise帽ado como un script de nivel superior que ejecuta el programa Python: llama expl铆citamente a una funci贸n hello_printere imprime el valor de una variable en la pantalla.

    Ejecutemos el archivo ‘my_script.py’ en la terminal:

    $ python my_script.py
    
    Hello world!
    Creator: John
    

    Como se se帽al贸 anteriormente, una conclusi贸n importante de este primer ejemplo b谩sico es que los nombres de archivo de los m贸dulos son importantes. Una vez importados, se convierten en variables / objetos en el m贸dulo de importaci贸n. Todas las definiciones de c贸digo de nivel superior dentro de un m贸dulo se convierten en atributos de esa variable.

    Por ‘nivel superior’ me refiero a cualquier funci贸n o variable que no est茅 anidada dentro de otra funci贸n o clase. Luego se puede acceder a estos atributos usando la <object>.<attribute>declaraci贸n est谩ndar en Python.

    En la siguiente secci贸n, primero miramos el “panorama general” de los programas Python de m煤ltiples archivos, y luego en los archivos Python de “modo dual”.

    Arquitectura del programa

    Cualquier programa Python no trivial se organizar铆a en varios archivos, conectados entre s铆 mediante importaciones. Python, como la mayor铆a de los otros lenguajes de programaci贸n, utiliza esta estructura de programa modular, donde las funcionalidades se agrupan en unidades reutilizables. En general, podemos distinguir tres tipos de archivos en una aplicaci贸n Python de m煤ltiples archivos:

    • archivo de nivel superior: un archivo de Python, o secuencia de comandos, que es el punto de entrada principal del programa. Este archivo se ejecuta para iniciar su aplicaci贸n.
    • m贸dulos definidos por el usuario: archivos de Python que se importan al archivo de nivel superior, o entre s铆, y proporcionan funcionalidades independientes. Por lo general, estos archivos no se inician directamente desde el s铆mbolo del sistema y est谩n hechos a medida para el prop贸sito del proyecto.
    • m贸dulos de biblioteca est谩ndar: m贸dulos precodificados que est谩n integrados en el paquete de instalaci贸n de Python, como herramientas independientes de la plataforma para interfaces del sistema, secuencias de comandos de Internet, construcci贸n de GUI y otros. Estos m贸dulos no forman parte del ejecutable de Python en s铆, sino de la biblioteca est谩ndar de Python .

    La Figura 1 muestra una estructura de programa de ejemplo con los tres tipos de archivos:

    Figura 1: Una estructura de programa de ejemplo que incluye un script de nivel superior, m贸dulos personalizados y m贸dulos de biblioteca est谩ndar.

    En esta figura, el m贸dulo ‘top_module.py’ es un archivo de Python de nivel superior que importa las herramientas definidas en el m贸dulo ‘m贸dulo1’, pero tambi茅n tiene acceso a las herramientas de ‘m贸dulo2’ a ‘m贸dulo1’. Los dos m贸dulos personalizados utilizan los recursos del otro, as铆 como otros m贸dulos de la biblioteca est谩ndar de Python. La cadena de importaci贸n puede ser tan profunda como desee: no hay l铆mite en la cantidad de archivos importados y se pueden importar entre s铆, aunque debe tener cuidado con la importaci贸n circular.

    Ilustremos esto con un ejemplo de c贸digo:

    # top_module.py
    import module1
    module1.print_parameters()
    print(module1.combinations(5, 2))
    
    
    # module1.py
    from module2 import k, print_parameters
    from math import factorial
    n = 5.0
    def combinations(n, k):
        return factorial(n) / factorial(k) / factorial(n-k)
    
    
    # module2.py
    import module1
    k = 2.0
    def print_parameters():
        print('k = %.f n = %.f' % (k, module1.n))
    

    En el ejemplo anterior, ‘top_module.py’ es un m贸dulo de nivel superior que ser谩 ejecutado por el usuario e importa herramientas de otros m贸dulos a trav茅s de ‘module1.py’. module1y module2son m贸dulos definidos por el usuario, mientras que el m贸dulo ‘matem谩tico’ se importa de la biblioteca est谩ndar de Python. Al ejecutar el script de nivel superior, obtenemos:

    $ python top_module.py
    k = 2 n = 5
    10.0
    

    Cuando se ejecuta un archivo Python de nivel superior, sus declaraciones de c贸digo fuente y las declaraciones dentro de los m贸dulos importados se compilan en un formato intermedio conocido como c贸digo de bytes , que es un formato independiente de la plataforma. Los archivos de c贸digo de bytes de los m贸dulos importados se almacenan con una extensi贸n .pyc en el mismo directorio que el archivo .py para las versiones de Python hasta 3.2, y en el directorio __pycache__ en el directorio de inicio del programa en Python 3.2+.

    $ ls __pycache__/
    module1.cpython-36.pyc  module2.cpython-36.pyc
    

    C贸digo de modo dual

    Como se mencion贸 anteriormente, los archivos Python tambi茅n se pueden dise帽ar como m贸dulos importables y como scripts de nivel superior. Es decir, cuando se ejecuta, el m贸dulo Python se ejecutar谩 como un programa independiente y, cuando se importe, actuar谩 como un m贸dulo importable que contiene definiciones de c贸digo.

    Esto se hace f谩cilmente usando el atributo __name__, que se integra autom谩ticamente en cada m贸dulo. Si el m贸dulo se ejecuta como un script de nivel superior, el atributo __name__ ser谩 igual a la cadena “__main__”; de lo contrario, si se importa, contendr谩 el nombre del m贸dulo real.

    Aqu铆 hay un ejemplo de c贸digo de modo dual:

    # hiprinter.py
    
    # Name definitions part
    multiply = 3
    def print_hi():
        print("Hi!" * multiply)
    
    # Stand-alone script part
    if __name__ == '__main__':
        print_hi()
    

    El archivo ‘hiprinter.py’ anterior define una funci贸n, que estar谩 expuesta al cliente cuando se importe. Si el archivo se ejecuta como un programa independiente, la misma funci贸n se llama autom谩ticamente. La diferencia aqu铆, en comparaci贸n con el ejemplo ‘my_script.py’ en la secci贸n Conceptos b谩sicos, es que cuando se importa ‘hiprinter.py’, no ejecutar谩 el c贸digo anidado bajo la if __name__ == '__main__'declaraci贸n.

    # Terminal window
    
    $ python hiprinter.py
    Hi!Hi!Hi!
    
    # Python interpreter
    
    >> import hiprinter
    >> hiprinter.print_hi()
    Hi!Hi!Hi!
    

    El c贸digo de modo dual es muy com煤n en la pr谩ctica y especialmente 煤til para pruebas unitarias: mientras que las variables y funciones se definen como nombres de nivel superior en el archivo, la parte dentro de la ifdeclaraci贸n puede servir como un 谩rea de prueba de los nombres definidos anteriormente. .

    Usando un m贸dulo

    Declaraciones de importaci贸n

    El ejemplo en la secci贸n Arquitectura del programa fue 煤til para ver la diferencia entre dos declaraciones de importaci贸n: importy from. La principal diferencia es que importcarga todo el m贸dulo como un solo objeto, mientras fromcarga propiedades y funciones espec铆ficas del m贸dulo. La importaci贸n de nombres con la fromdeclaraci贸n se puede utilizar directamente en el m贸dulo de importaci贸n, sin llamar al nombre del objeto importado.

    El uso de la fromdeclaraci贸n solo est谩 permitido en el nivel superior del archivo de m贸dulo en Python 3.x, y no dentro de una funci贸n. Python 2.x permite usarlo en una funci贸n, pero emite una advertencia. En cuanto al rendimiento, la fromdeclaraci贸n es m谩s lenta importporque hace todo el trabajo que importhace: revisa todo el contenido del m贸dulo importado y luego realiza un paso adicional para seleccionar los nombres adecuados para la importaci贸n.

    Tambi茅n hay una tercera declaraci贸n de importaci贸n from *que se usa para importar todos los nombres de nivel superior del m贸dulo importado y usarlos directamente en la clase de importador. Por ejemplo, podr铆amos haber usado:

    from module2 import *
    

    Esto importar铆a todos los nombres (variables y funciones) del archivo module2.py. Este enfoque no se recomienda debido a la posible duplicaci贸n de nombres: los nombres importados podr铆an sobrescribir los nombres ya existentes en el m贸dulo de importaci贸n.

    Ruta de b煤squeda del m贸dulo

    Un aspecto importante al escribir aplicaciones modulares de Python es ubicar los m贸dulos que deben importarse. Si bien los m贸dulos de la biblioteca est谩ndar de Python est谩n configurados para ser accesibles globalmente, la importaci贸n de m贸dulos definidos por el usuario a trav茅s de los l铆mites del directorio puede resultar m谩s complicado.

    Python usa una lista de directorios en los que busca m贸dulos, conocida como ruta de b煤squeda. La ruta de b煤squeda se compone de directorios que se encuentran en lo siguiente:

    • Directorio de inicio del programa. La ubicaci贸n del script de nivel superior. Tenga en cuenta que el directorio de inicio puede no coincidir con el directorio de trabajo actual.
    • PYTHONPATHdirectorios. Si se establece, la PYTHONPATHvariable de entorno define una concatenaci贸n de directorios definidos por el usuario donde el int茅rprete de Python debe buscar m贸dulos.
    • Directorios de bibliotecas est谩ndar. Estos directorios se configuran autom谩ticamente con la instalaci贸n de Python y siempre se buscan.
    • Directorios enumerados en archivos .pth. Esta opci贸n es una alternativa PYTHONPATHy funciona agregando sus directorios, uno por l铆nea, en un archivo de texto con el sufijo .pth, que debe colocarse en el directorio de instalaci贸n de Python, que generalmente es / usr / local / lib / python3. 6 / en una m谩quina Unix o C: Python36 en una m谩quina Windows.
    • El directorio de paquetes de sitio. Este directorio es donde se agregan autom谩ticamente todas las extensiones de terceros.

    PYTHONPATHes probablemente la forma m谩s adecuada para que los desarrolladores incluyan sus m贸dulos personalizados en la ruta de b煤squeda. Puede verificar f谩cilmente si la variable est谩 configurada en su computadora, lo que en mi caso resulta en:

    $ echo $PYTHONPATH
    /Users/Code/Projects/:
    

    Para crear la variable en una m谩quina con Windows, debe usar las instrucciones en “Panel de control -> Sistema -> Avanzado”, mientras que en MacOS y otros sistemas Unix es m谩s f谩cil agregar la siguiente l铆nea a ~ / .bashrc o ~ /. archivos bash_profile, donde sus directorios est谩n concatenados con un signo de dos puntos (“:”).

    export PYTHONPATH=<Directory1:Directory2:...:DirectoryN>:$PYTHONPATH".
    

    Este m茅todo es muy similar a agregar directorios a su Unix $ PATH.

    Una vez que todos los directorios se encuentran en la ruta de b煤squeda durante el inicio del programa, se almacenan en una lista que se puede explorar sys.pathen Python. Por supuesto, tambi茅n puede agregar un directorio sys.pathy luego importar sus m贸dulos, lo que solo modificar谩 la ruta de b煤squeda durante la ejecuci贸n del programa.

    PYTHONPATHLas opciones de todos modos y .pth permiten una modificaci贸n m谩s permanente de la ruta de b煤squeda. Es importante saber que Python escanea la cadena de la ruta de b煤squeda de izquierda a derecha, por lo tanto, los m贸dulos dentro de los directorios listados m谩s a la izquierda pueden sobrescribir los que tienen el mismo nombre en la parte m谩s a la derecha. Tenga en cuenta que las rutas de b煤squeda de m贸dulos solo son necesarias para importar m贸dulos en diferentes directorios.

    Como se muestra en el siguiente ejemplo, la cadena vac铆a al principio de la lista es para el directorio actual:

    import sys
    sys.path
    
    ['',
     '/Users/Code/Projects',
     '/Users/Code/Projects/Blogs',
     '/Users/Code/anaconda3/lib/python36.zip',
     '/Users/Code/anaconda3/lib/python3.6',
     '/Users/Code/anaconda3/lib/python3.6/site-packages',
     '/Users/Code/anaconda3/lib/python3.6/site-packages/IPython/extensions',
     '/Users/Code/.ipython']
    

    Como conclusi贸n, organizar su programa Python en m煤ltiples m贸dulos interconectados es bastante sencillo si su programa est谩 bien estructurado: en porciones de c贸digo autocontenidas y agrupadas naturalmente. En programas m谩s complejos o no tan bien estructurados, la importaci贸n puede convertirse en una carga y deber谩 abordar temas de importaci贸n m谩s avanzados.

    Recargas de m贸dulos

    Gracias al almacenamiento en cach茅, un m贸dulo se puede importar solo una vez por proceso. Dado que Python es un lenguaje interpretado, ejecuta el c贸digo del m贸dulo importado una vez que llega a una declaraci贸n importo from. Las importaciones posteriores dentro del mismo proceso (por ejemplo: el mismo int茅rprete de Python) no volver谩n a ejecutar el c贸digo del m贸dulo importado. Simplemente recuperar谩 el m贸dulo de la cach茅.

    He aqu铆 un ejemplo. Reutilicemos el c贸digo anterior en ‘my_module.py’, import茅moslo en un int茅rprete de Python, luego modifiquemos el archivo y volvamos a importarlo.

    >> import my_module
    >> print(my_module.name)
    John
    
    # Now modify the 'name' variable in 'my_module.py' into name="Jack" and reimport the module
    
    >> import my_module
    >> print(my_module.name)
    John
    

    Para deshabilitar el almacenamiento en cach茅 y habilitar la reimportaci贸n de m贸dulos, Python proporciona una reloadfunci贸n. Prob茅moslo en la misma ventana de Python que antes:

    >> from imp import reload  # Python3.x
    >> reload(my_module)
    <module 'my_module' from '/Users/Code/Projects/small_example/my_module.py'>
    >> print(my_module.name)
    Jack
    

    La reloadfunci贸n modifica el m贸dulo in situ. Es decir, sin afectar otros objetos que hagan referencia al m贸dulo importado. Puede notar que la funci贸n tambi茅n devuelve el m贸dulo en s铆, dando su nombre y ruta de archivo. Esta caracter铆stica es especialmente 煤til en la fase de desarrollo, pero tambi茅n en proyectos m谩s grandes.

    Por ejemplo, para los programas que necesitan una conectividad permanente a un servidor, es mucho m谩s costoso reiniciar toda la aplicaci贸n que hacer una recarga din谩mica, o recargar en caliente para usar durante el desarrollo.

    Paquetes de m贸dulos

    Al importar nombres de m贸dulos, en realidad carga archivos de Python almacenados en alg煤n lugar de su sistema de archivos. Como se mencion贸 anteriormente, los m贸dulos importados deben residir en un directorio, que se enumera en la ruta de b煤squeda de su m贸dulo ( sys.path). En Python hay m谩s que estas “importaciones de nombres”; de hecho, puede importar un directorio completo que contenga archivos de Python como un paquete de m贸dulo. Estas importaciones se conocen como importaciones de paquetes.

    Entonces, 驴c贸mo se importan los paquetes de m贸dulos? Creemos un directorio llamado ‘mydir’ que incluye un m贸dulo ‘mod0.py’ y dos subdirectorios ‘subdir1’ y ‘subdir2’, que contienen los m贸dulos ‘mod1.py’ y ‘mod2.py’ respectivamente. La estructura del directorio se ve as铆:

    $ ls -R mydir/
    mod0.py subdir1 subdir2
    
    my_dir//subdir1:
    mod1.py
    
    my_dir//subdir2:
    mod2.py
    

    El enfoque habitual explicado hasta ahora era agregar las rutas ‘mydir’, ‘subdir1’ y ‘subdir2’ a la ruta de b煤squeda del m贸dulo ( sys.path), para poder importar ‘mod0.py’, ‘mod1.py’ y ‘mod2.py’. Esto podr铆a convertirse en una gran sobrecarga si sus m贸dulos se distribuyen en muchos subdirectorios diferentes, que suele ser el caso. De todos modos, las importaciones de paquetes est谩n aqu铆 para ayudar. Trabajan importando el nombre de la carpeta en s铆.

    Este comando, por ejemplo, no est谩 permitido y dar谩 como resultado un error de InvalidSyntax:

    >> import /Users/Code/Projects/mydir/
      File "<stdin>", line 1
        import /Users/Code/Projects/mydir/
               ^
    SyntaxError: invalid syntax
    

    La forma correcta de hacerlo es establecer solo el directorio contenedor ‘/ Usuarios / C贸digo / Proyectos /’ en la ruta de b煤squeda de su m贸dulo (agregarlo a la PYTHONPATHvariable de entorno o enumerarlo en un archivo .pth) y luego importar sus m贸dulos usando el sintaxis punteada. Estas son algunas importaciones v谩lidas:

    >> import mydir.mod0
    >> import mydir.subdir1.mod1 as mod1
    >> from mydir.subdir2.mod2 import print_name  # print_name is a name defined within mod2.py
    

    Probablemente haya notado anteriormente que algunos directorios de Python incluyen un archivo __init__.py. En realidad, esto era un requisito en Python2.x para decirle a Python que su directorio es un paquete de m贸dulos. El archivo __init__.py tambi茅n es un archivo Python normal que se ejecuta cada vez que se importa ese directorio y es adecuado para inicializar valores, por ejemplo, para realizar la conexi贸n a una base de datos.

    De todos modos, en la mayor铆a de los casos, estos archivos se dejan vac铆os. En Python3.x, estos archivos son opcionales y puede usarlos si es necesario. Las siguientes l铆neas muestran c贸mo los nombres definidos en __init__.py se convierten en atributos del objeto importado (el nombre del directorio que lo contiene).

    # __init__.py file in mydir/subdir1/ with code:
    param = "init subdir1"
    print(param)
    
    
    # Import it from a Python interpreter
    >> import mydir.subdir1.mod1
    init subdir1
    
    
    # param is also accessible as an attribute to mydir.subdir1 object
    >> print(mydir.subdir1.param)
    init subdir1
    

    Otro tema importante cuando se habla de paquetes de m贸dulos son las importaciones relativas. Las importaciones relativas son 煤tiles al importar m贸dulos dentro del propio paquete. En este caso, Python buscar谩 el m贸dulo importado dentro del alcance del paquete y no en la ruta de b煤squeda del m贸dulo.

    Demostraremos un caso 煤til con un ejemplo:

    # mydir/subdir1/mod1.py
    import mod2
    
    
    # In Python interpreter:
    >> import mydir.subdir1.mod1
    ModuleNotFoundError: No module named 'mod2'
    

    La import mod2l铆nea le dice a Python que busque el m贸dulo ‘mod2’ en la ruta de b煤squeda del m贸dulo y, por lo tanto, no tiene 茅xito. En cambio, una importaci贸n relativa funcionar谩 bien. La siguiente declaraci贸n de importaci贸n relativa utiliza un punto doble (“..”) que denota el padre del paquete actual (‘mydir /’). Se debe incluir el siguiente subdir2 para crear una ruta relativa completa al m贸dulo mod2.

    # mydir/subdir1/mod1.py
    from ..subdir2 import mod2
    

    Las importaciones relativas son un tema enorme y podr铆an ocupar todo un cap铆tulo de un libro. Tambi茅n difieren mucho entre las versiones Python2.xy 3.x. Por ahora, solo hemos mostrado un caso 煤til, pero deber铆a haber m谩s para seguir en publicaciones de blog separadas.

    Y hablando de Python 2.x, el soporte para esta versi贸n finaliza en 2020 , por lo que en los casos en los que hay una gran diferencia entre las versiones de Python, como en las importaciones relativas, es mejor centrarse en la versi贸n 3.x.

    Enviar un paquete a PyPi

    Hasta ahora, ha aprendido a escribir m贸dulos Python, distinguir entre m贸dulos importables y de nivel superior, utilizar m贸dulos definidos por el usuario a trav茅s de los l铆mites del directorio, modificar la ruta de b煤squeda del m贸dulo y crear / importar paquetes de m贸dulos, entre otras cosas. Una vez que haya creado un software 煤til, empaquetado en un paquete de m贸dulos, es posible que desee compartirlo con la gran comunidad de Python. Despu茅s de todo, Python es creado y mantenido por la comunidad.

    El 铆ndice de paquetes de Python (PyPI) es un repositorio de software para Python, que actualmente contiene m谩s de 120K de paquetes (en el momento de escribir este art铆culo). Es posible que haya instalado m贸dulos antes desde este repositorio usando el pipcomando.

    Por ejemplo, la siguiente l铆nea descargar谩 e instalar谩 la biblioteca Numpy para inform谩tica cient铆fica:

    $ pip install numpy
    

    Hay m谩s informaci贸n sobre la instalaci贸n de paquetes con pip aqu铆 . Pero, 驴c贸mo contribuye con su propio paquete? Aqu铆 hay algunos pasos para ayudarlo.

    • Primero, satisfaga los requisitos de empaque y distribuci贸n. Aqu铆 se necesitan dos pasos:
      • Instale pip, setuptools y wheel. M谩s informaci贸n sobre eso aqu铆 .
      • Instale el hilo , que se utiliza para cargar su proyecto en PyPI
    $ pip install twine
    
    • El siguiente paso es configurar su proyecto. En general, esto significa agregar algunos archivos de Python a su proyecto que contendr谩n la informaci贸n de configuraci贸n, gu铆as de uso, etc. PyPI proporciona un proyecto de muestra de ejemplo que puede usar como gu铆a. Estos son los archivos m谩s importantes que debe agregar:
      • setup.py: este archivo debe agregarse a la ra铆z de su proyecto y sirve como una interfaz de l铆nea de comandos de instalaci贸n. Debe contener una setup()funci贸n que acepte como argumentos informaci贸n como: nombre del proyecto, versi贸n, descripci贸n, licencia, dependencias del proyecto, etc.
      • README.rst: un archivo de texto que describe su paquete.
      • licence.txt: un archivo de texto que contiene su licencia de software. M谩s informaci贸n sobre c贸mo elegir una licencia , a trav茅s de GitHub.
    • Empaqueta tu proyecto. El tipo de paquete m谩s utilizado es ‘rueda’, aunque tambi茅n puede proporcionar el requisito m铆nimo como ‘distribuci贸n / paquete de origen’. Aqu铆 debe utilizar el archivo ‘setup.py’ del paso anterior. La ejecuci贸n de uno de los siguientes comandos crear谩 un directorio ‘dist /’ en la ra铆z de su proyecto, que contiene los archivos para cargar en PyPI.
    # Package as source distribution
    $ python setup.py sdist
    
    
    # Package as wheel supporting a single Python version
    $ python setup.py bdist_wheel
    
    • El 煤ltimo paso es cargar su distribuci贸n en PyPI. B谩sicamente, aqu铆 hay dos pasos:
      • Crea una cuenta PyPI.
      • Cargue el contenido del directorio ‘dist /’ creado en el paso anterior. Aqu铆 es posible que desee cargar una prueba primero utilizando el sitio de prueba de PyPI .
    $ twine upload dist/*
    

    Eso es practicamente todo. Para obtener m谩s informaci贸n, el sitio web de PyPI tiene todas las instrucciones detalladas si se queda atascado.

    Conclusi贸n

    Esta publicaci贸n ten铆a la intenci贸n de guiarlo desde los conceptos b谩sicos b谩sicos de los m贸dulos de Python (crear e importar sus primeros m贸dulos importables), a temas un poco m谩s avanzados (modificar la ruta de b煤squeda, paquetes de m贸dulos, recargas y algunas importaciones relativas b谩sicas), para enviar su Paquete de Python al repositorio de software de Python PyPI.

    Hay mucha informaci贸n sobre este tema y no pudimos cubrir todo en esta publicaci贸n, por lo que es posible que no pueda abordar todos estos pasos y enviar un paquete oficial dentro del tiempo de lectura de esta publicaci贸n. Sin embargo, cada paso debe ser una breve introducci贸n para guiarlo en su camino de aprendizaje.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *