Problemas con sys.path () y PYTHONPATH

He estado aprendiendo Python, estoy trabajando en 2.7.3 y estoy tratando de entender las declaraciones de import .

  1. La documentación dice que cuando intenta importar un módulo, el intérprete primero buscará uno de los módulos integrados.

    ¿Qué se entiende por un módulo incorporado?

  2. Luego, la documentación dice que el intérprete busca en los directorios enumerados por sys.path, y que sys.path se inicializa desde estas fonts:

    • el directorio que contiene el script de entrada (o el directorio actual).
    • PYTHONPATH (una lista de nombres de directorio, con la misma syntax que la variable de shell PATH ).
    • el predeterminado dependiente de la instalación.

    Aquí hay una salida de muestra de un comando sys.path de mi computadora que usa python en el modo de línea de comandos: (eliminé algunos para que no fuera enorme)

     ['', '/usr/lib/python2.7', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 

    Ahora, asumo que la ruta ” se refiere al directorio que contiene el ‘script’, por lo que pensé que el rest de ellos PYTHONPATH mi variable ambiental PYTHONPATH . Sin embargo, cuando voy a la terminal y env , PYTHONPATH no existe como una variable ambiental. También intenté import os os.environ luego os.environ , pero obtengo el mismo resultado.

    ¿Realmente no tengo una variable ambiental PYTHONPATH? No creo que alguna vez haya definido específicamente una variable de entorno PYTHONPATH, pero asumí que cuando instalé nuevos paquetes, ellos modificaron automáticamente esa variable de entorno. Si no tengo PYTHONPATH, ¿cómo se llena mi sys.path? Si descargo paquetes nuevos, ¿cómo sabe Python dónde buscarlos si no tengo esta variable PYTHONPATH?

  3. ¿Cómo funcionan las variables de entorno? Por lo que entiendo, las variables de entorno son específicas del proceso para el cual se configuran, sin embargo, si abro varias ventanas de terminal y ejecuto env , todas muestran una cantidad de variables idénticas, por ejemplo, PATH . Sé que hay ubicaciones de archivos para variables de entorno persistentes, por ejemplo /etc/environment , que contiene mi variable PATH . ¿Es posible decir dónde se almacena una variable de entorno persistente? ¿Cuál es la ubicación recomendada para almacenar nuevas variables de entorno persistentes? ¿Cómo funcionan las variables de entorno con, por ejemplo, el intérprete de Python? El intérprete de Python busca PYTHONPATH , pero ¿cómo funciona en el nivel mínimo?

¡Tantas preguntas de una vez! 🙂

Bueno, trato de responder solo a algunos de ellos.

1) un módulo incorporado es cualquier módulo que viene con una versión de python. Por ejemplo, los módulos sys y os son módulos integrados. Eso es todo.

2) La variable PYTHONPATH no existe de forma predeterminada en su sistema. Cuando inicias el intérprete de python, llena la matriz de ruta donde busca los módulos, tal como lo describiste. Este es el resultado de sys.path. Sin embargo, sys.path no es la variable de entorno PYTHONPATH. Si configura PYTHONPATH en su sistema, toda la ruta contenida en él se incluirá en la matriz que el intérprete de python utiliza para buscar módulos.

Dejaré la respuesta a las variables de entorno para otros, ya que no creo que sea la persona adecuada para responder a esa pregunta. Sin embargo, mi sensación es que podría cambiar de un sistema a otro. De todas formas…

Espero eso ayude.

  1. Los módulos incorporados son los módulos enumerados en sys.builtin_module_names . Estos módulos se comstackn junto con el intérprete y, por lo tanto, siempre están disponibles. Tenga en cuenta que forman parte de la biblioteca estándar, pero la biblioteca estándar incluye muchos más módulos. Para dejar clara la diferencia, si intenta ejecutar este código en python3.3:

     >>> import sys >>> sys.path = [] >>> import os # works >>> import traceback # ImportError, traceback is in the stdlib! 

    En python2, ambos tienen éxito porque los casos especiales de import son la ruta estándar de la biblioteca. (Vea esto para obtener más información sobre los cambios a import en python3.3).

  2. Si no se encuentra PYTHONPATH entonces no incluye ningún directorio adicional. Sin embargo, la documentación que vincula también indica que Python utiliza un “valor predeterminado dependiente de la instalación”. Los directorios que está viendo en su sys.path se definen en este “predeterminado por defecto de instalación”. Si define PYTHONPATH , puede agregar otros directorios a sys.path antes que el predeterminado, pero no se hace ningún daño sin definirlo.

  3. Las variables de entorno se definen por proceso, sin embargo, los shells pueden proporcionar su propio “scope” de variables a los subprocesos que inician. Por ejemplo, puede establecer variables de entorno en los archivos shell como ~/.bashrc o ~/.profile .

    Si está en Ubuntu, la forma preferible de definir una variable de entorno de sistema amplio y persistente es mediante el uso de pam_enviroment . Puede ver esta pregunta en Ask Ubuntu que muestra cómo puede configurar una variable de entorno para todo el sistema.

    AFAIK, no existe una forma estándar de configurarlos para cada (por ejemplo) una distribución de Linux, y, obviamente, cada sistema operativo tiene su propio método de definición.

    Si desea una explicación más detallada sobre el manejo de las variables de entorno, probablemente debería preguntar al Superusuario .

PYTHONPATH no está definido en su sistema. Eso significa que todo lo que se ve en sys.path excepto '' es” el valor predeterminado dependiente de la instalación “.

Las variables de entorno caracterizan el entorno, no un proceso. Sin embargo, puede modificarlos al iniciar un proceso utilizando, por ejemplo, el comando env Linux. Eso básicamente significa que el proceso se ejecutará en un entorno diferente. El “cómo funciona si” parte de su pregunta puede tener respuestas que dependen de la plataforma. Sin embargo, no creo que puedas “decir dónde se almacena una variable de entorno persistente”, si te refieres a un archivo. Las variables de entorno se pueden configurar en cualquiera de los archivos que se ejecutan en algún momento (generalmente al inicio) o solo en la línea de comandos.