2012-03-06 12 views
15

Ok, así que realmente quiero hacerlo bien porque sigo encontrándome con él al generar algunos grandes paquetes py2app/py2exe. Así que tengo mi paquete que contiene muchos módulos/paquetes que también pueden estar en los paquetes de sitios de los usuarios/ubicación predeterminada (si un usuario tiene una distribución de python) pero quiero que mis paquetes distribuidos surtan efecto antes de que se ejecuten desde mi distribución .rutas python y orden de importación

Ahora por lo que he leído herePYTHONPATH debe ser la primera cosa añaden a sys.path después de que el directorio actual, sin embargo por lo que he probado en mi máquina que no es el caso y todas las carpetas definidas por en $site-packages$/easy-install.pth tienen prioridad sobre esto.

Así que, ¿alguien podría darme más explicaciones en profundidad sobre este pedido de importación? // ayúdame a encontrar una manera de establecer las variables ambientales de modo que los paquetes que distribuyo tengan prioridad sobre los instalados por defecto. Hasta ahora mi intento es, por ejemplo, en Mac OS-py2app, en mi guión punto de entrada:

os.environ['PYTHONPATH'] = DATA_PATH + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH 
                  , 'lib') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
           DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
          DATA_PATH, 'lib', 'python2.7', 'site-packages.zip') 

Esta es básicamente la estructura del paquete generado por py2app. Luego simplemente:

SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver' 
          , cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT], 
          shell=False, stdin=IN_FILE, stdout=OUT_FILE, 
          stderr=ERR_FILE) 

Aquí python_exe_path es el camino hacia el exe pitón que se agrega por py2app al paquete. Ahora esto funciona bien en una máquina que no tiene una python instalada. Sin embargo, cuando la distribución de python ya está presente, sus paquetes de sitio tienen prioridad.

Respuesta

13

Python busca los caminos en sys.path en orden (ver http://docs.python.org/tutorial/modules.html#the-module-search-path). easy_install cambia esta lista directamente (véase la última línea en el archivo de fácil install.pth):

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

Básicamente, esto lleva a que sea directorios se añaden y los inserta al principio de la lista.

Ver también Eggs in path before PYTHONPATH environment variable.

+0

Probablemente la opción más fácil al distribuir el proyecto py2exe es distribuir todos sus módulos necesarios y pythonXX.dll junto con él, de modo que sea un paquete independiente que no se vea afectado por ninguna versión de python instalada actualmente. Otro proyecto interesante para usted puede ser virtualenv (http://pypi.python.org/pypi/virtualenv) – cwa

+0

Entonces, ¿distribuir pythonXX.dll debería detener el proceso que acabo de describir? ¿A qué nivel de la carpeta de distribución debería estar el .dll? Pregunto porque actualmente estoy agregando pythonXX.dll al paquete, pero ese problema aún ocurre. – Bogdan

Cuestiones relacionadas