2012-06-08 22 views
7

Cuando se importa un módulo no incorporado, el intérprete busca en las ubicaciones indicadas en sys.path. sys.path se inicializa a partir de estos lugares (http://docs.python.org/library/sys.html#sys.path):¿Cómo se determina la ruta de búsqueda del módulo python en Mac OS X?

  1. el directorio que contiene la secuencia de comandos de entrada (o el directorio actual)
  2. PYTHONPATH
  3. la instalación dependiente predeterminado

Mientras que los dos primero las fuentes son directas, ¿alguien puede explicar cómo funciona el tercero y qué posibilidades hay para influir en él?

A pesar de que estaría interesado en una solución general, mis problemas específicos son:

  • He instalado el Enthought distribution 7.2 32-bit, y luego Scipy-Superpack. Ahora Python pensado en importar intenta numpy desde /Library/Python/2.7/, que es donde superpack los instaló, en lugar de desde los paquetes de sitio enthought.
  • a wxPython aplicación creada con py2app-A no tiene el mismo sys.path que al iniciar la aplicación con python start_app.py.

Respuesta

2

La base de la tercera fuente se establece en tiempo de compilación (o configurar el tiempo, más precisamente), dependiendo de la plataforma. Luego se expande y se agrega en tiempo de ejecución a través de los archivos .pth, etc. (que es algo que puede hacer una vez que se compila el ejecutable de Python para influir en esa tercera fuente).

Esta página de la documentación de Python tiene toda la información sobre cómo funcionan las .pth archivos, y también más información sobre cómo sys.path está construido a partir de la configuración en tiempo de compilación, etc. http://docs.python.org/library/site.html

No estoy seguro de por qué quiere para influir en esa tercera fuente específicamente, cuando se puede influir en el total sys.path. De todos modos, las tres formas de influir en sys.path (sin recompilar Python o parchear el código fuente) son:

  1. A través de la variable de entorno PYTHONPATH.
  2. Creando archivos .pth y soltándolos donde Python escanea paquetes. (Vea el enlace anterior para más detalles.)
  3. mediante programación, mediante la importación de sys y luego añadiendo o anteponiendo a sys.path

    import sys 
    sys.path.insert(0, '/this/path/will/be/considered/first') 
    

Con suerte una de estas tres maneras debe ayudarle a hacer lo que quiera.

+0

Gracias por esta respuesta! La razón por la que estoy interesado en la tercera fuente específicamente es para los casos en que hay bibliotecas no deseadas que no están en 'PYTHONPATH', que causan un error en el que no tengo acceso directo a sys.path, p. al construir la documentación de esfinge. – christianbrodbeck

1

En un sistema Mac OS X 10.7.5, también tuve el problema de que Enthought python estaba buscando módulos en /Library/Python/2.7/. Aparentemente, esto fue causado por el archivo easy-install.pth ubicado en /Library/Python/2.7/site-packages. Después de cambiar la extensión de este archivo, Enthought Python importó los módulos de Enthought (de/Library/Frameworks/Pixthon.framework/Variations/7.3/lib/python2.7/site -packages).

Cuestiones relacionadas