En la sección anterior, cubrimos los aspectos básicos del módulo de Python. En esta sección, continuamos profundizando en el conocimiento del módulo para que podamos entender, dominar y aplicar el módulo a nuestra programación real.
En la sección anterior, hay una frase "A continuación ejecutamos el IPython del intérprete de Python en el directorio donde se encuentra este archivo", no sé si aún lo recuerda. El significado implícito detrás de esto es que en este directorio de archivo (módulo), podemos importar a este módulo, de lo contrario, informará de un error y dice que no se puede encontrar este módulo. Aquí, implica la ruta de búsqueda del módulo Python.
Ruta de búsqueda del módulo Python
Cuando se importa un módulo llamado mylib
, el intérprete primero busca un módulo con el nombre del módulo incorporado.
Si no se encuentra, busque el módulo llamado sys.path
el directorio llamado mylib
.
La inicialización de sys.path
en el orden de las siguientes rutas:
(1) El directorio que contiene el script de entrada, si no hay un script de entrada, es el directorio actual;
(2) variable de entorno PYTHONPATH (una lista de nombres de directorio);
(3) El directorio de instalación de la biblioteca de Python.
Verifiquemos la ruta contenida en sys.path
y escribamos un archivo Python initpath.py
siguiente manera:
# Author: veelion
# file: initpath.py
import sys
print('\n'.join(sys.path))
Ejecute la línea de comandos: python3 initpath.py
obtiene el siguiente resultado:
$ python mylib.py
/home/veelion/p2/tutorial/md_Python/codes
/home/veelion/.virtualenvs/py3.7/lib/python37.zip
/home/veelion/.virtualenvs/py3.7/lib/python3.7
/home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload
/usr/lib/python3.7
/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages
Podemos ver que el directorio donde se encuentra initpath.py
es el primer elemento de la lista sys.path
. En línea con los tres principios anteriores.
A continuación, observamos sys.path
través del intérprete interactivo de Python, ejecutamos el intérprete de CPython e importamos sys:
>>> import sys
>>> sys.path
['', '/home/veelion/.virtualenvs/py3.7/lib/python37.zip', '/home/veelion/.virtualenvs/py3.7/lib/python3.7', '/home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload', '/usr/lib/python3.7', '/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages']
Con atención, puede ver que el primer elemento en sys.path
es una cadena vacía , que es diferente de la primera en el modo de script. ¿Por qué es una cadena vacía?
Esto se debe a que, cuando ejecuta el intérprete de Python de forma interactiva (o el script se lee desde la entrada de anotación), puede pensar que la ruta del archivo de script que se pasa al intérprete está vacía, y luego configurar sys.path[0]
en un carácter nulo. Cadena, que le dice a Python que comience con la carpeta actual cuando busca módulos.
El sys.path
verificado por los dos métodos anteriores está en línea con las expectativas, pero IPython es un poco excepcional.
In [1]: import sys
In [2]: sys.path
Out[2]:
['/home/veelion/.virtualenvs/py3.7/bin',
'/home/veelion/.virtualenvs/py3.7/lib/python37.zip',
'/home/veelion/.virtualenvs/py3.7/lib/python3.7',
'/home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload',
'/usr/lib/python3.7',
'',
'/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages',
'/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages/IPython/extensions',
'/home/veelion/.ipython']
IPython no coloca la ruta actual en el primer elemento. Esto hará que el módulo que escriba sea el mismo que el módulo del sistema. Importa el módulo del sistema en lugar del que usted escribió. Los dos primeros métodos son importar el módulo que escribió en lugar del módulo del sistema. Esto es especialmente importante cuando se usa IPython.
Tenga en cuenta que puede modificar sys.path
en su programa. sys.path
es una estructura de lista de Python, podemos modificarla como una lista modificada, agregar, eliminar, modificar el orden de la ruta. Por ejemplo, puede usar sys.path.insert(0, 'my-module-path')
para colocar la sys.path.insert(0, 'my-module-path')
nuestro propio módulo en la parte superior de la ruta de búsqueda, y buscar primero su propio módulo.
Archivo Python compilado: *pyc
Para acelerar el tiempo de carga del módulo, Python almacenará en caché los módulos compilados y los __pycache__
en la carpeta __pycache__
en el mismo directorio que el módulo. El módulo compilado se denomina: module.version.pyc
, donde version
contiene el número de versión de Python. Por ejemplo:
$ ls __pycache__/
m1.cpython-36.pyc m2.cpython-36.pyc
cpython-36
es la información de Python para compilar este módulo: compilado con CPython 3.6. Este esquema de denominación facilita la existencia de diferentes versiones de módulos compilados por Python al mismo tiempo sin causar conflictos.
Python no comprueba el caché en ninguno de los casos.
Primero, siempre recompila y no almacena los resultados de los módulos cargados directamente desde la línea de comandos.
En segundo lugar, si no hay un archivo fuente del módulo, no verificará el caché. Para admitir distribuciones no fuente (solo compiladas), los módulos compilados deben estar en el directorio de origen y no deben tener código fuente de módulo.
Toma un ejemplo para entender estos dos puntos:
(1) Si ejecuta python m1.py
desde la línea de comandos, Python siempre compilará m1.py
desde la nueva, pero no guardará el archivo pyc, porque no hay necesidad de guardarlo cada vez que lo vuelva a compilar.
(2) Si importamos el módulo m1
, solo m1.pyc
y ningún archivo m1.py
en el directorio de la ruta de búsqueda, luego importamos m1.pyc
directamente. Este método es adecuado para publicar pycs compilados a otras personas en lugar de darles el código fuente. Al usar este método, copie el archivo __pycache__
de __pycache__
al mismo directorio que el archivo .py
y elimine el archivo .py
. .
Consejos avanzados para los módulos de Python
(1) El módulo compileall
puede compilar todos los archivos py en una carpeta en un archivo .pyc.
Su uso es muy simple, el formato de la línea de comando es el siguiente:
python -m compileall Carpeta o nombre de archivo
Se pueden encontrar más opciones por: python -m compileall -h
.
(2) Al compilar en un archivo .pyc
, puede darle a Python dos opciones: -O
y -OO
para -OO
el tamaño del archivo compilado.
-O elimina la afirmación de afirmación;
-OO elimina la declaración de afirmación y la __doc__ string
.
Use estas dos opciones dependiendo de la situación. Agregar esta opción cuando compila un archivo con compileall es así:
python -O -m compileall Carpeta o nombre de archivo
El nombre del archivo pyc generado tiene una etiqueta opt-2
, la etiqueta -O
es opt-
y la etiqueta -OO
es opt-2
. Por ejemplo:
$ ls -F -1 __pycache__/
m1.cpython-36.opt-1.pyc
m1.cpython-36.opt-2.pyc
m1.cpython-36.pyc
(3) Los .pyc
y .py
no hacen que el programa se ejecute más rápido (no aumentará la velocidad). Sin embargo, el archivo .pyc
puede hacer que la carga sea más rápida porque hay menos compilación.
Módulo estándar de Python
Python viene con una biblioteca de módulos estándar. Algunos de estos módulos están integrados en el intérprete, que proporciona acceso a operaciones que no forman parte del núcleo del idioma pero que aún están incorporadas para aumentar la eficiencia o proporcionar acceso a primitivas del sistema operativo, como las llamadas al sistema. La recopilación de estos módulos es una opción de configuración que también depende de la plataforma subyacente. Por ejemplo, el módulo winreg
solo está disponible en sistemas Windows. Un módulo notable es sys
, que está integrado en cada intérprete de Python.
El módulo de anotación de Python continuará siendo encontrado y utilizado en nuestra programación futura, y el aprendizaje específico se puede aprender en el futuro. Algo que debe tener en cuenta es que cuando necesita escribir algunas funciones básicas para el código Python, asegúrese de averiguar si ya existen módulos estándar. Ya ha escrito un módulo que contiene estas funciones y, finalmente, debe sentirse usted mismo. ¿Quieres implementar estas características?
Función incorporada de Python dir ()
Dir () se usa para ver los nombres definidos en el módulo, que incluyen: nombre de variable, nombre de módulo, nombre de función, etc.
Devuelve una lista:
In [5]: import my_first_module
In [6]: dir(my_first_module)
Out[6]:
['MY_NAME',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'my_add',
'my_print']
Si se llama a dir () sin pasar un parámetro, se enumeran todos los nombres que están definidos actualmente:
In [1]: import my_first_module
In [2]: dir()
Out[2]:
['In',
'Out',
'_',
'__',
'___',
'__builtin__',
'__builtins__',
'__doc__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_dh',
'_i',
'_i1',
'_i2',
'_ih',
'_ii',
'_iii',
'_oh',
'exit',
'get_ipython',
'my_first_module',
'quit']
Utilice dir () para ver todos los tipos, variables, funciones, etc. incorporados mediante el uso de los módulos estándar builtins
:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
Resumen de habilidades avanzadas del módulo Python
(1) Ruta de búsqueda de Python, el orden debe quedar claro;
(2) El archivo .pyc
compilado;
(3) dir () función incorporada para ver el nombre de la definición del módulo.
留言
張貼留言