2011-12-29 13 views
48

Tengo un directorio lleno de scripts (digamos project/bin). También tengo una biblioteca ubicada en project/lib y quiero que los scripts carguen automáticamente. Esto es lo que normalmente utilizo en la parte superior de cada script:Python: la mejor forma de agregar sys.path en relación con el script actual en ejecución

#!/usr/bin/python 
from os.path import dirname, realpath, sep, pardir 
import sys 
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib") 

# ... now the real code 
import mylib 

Esta es una especie de engorroso, feo, y tiene que ser pegado al principio de cada archivo. ¿Hay una mejor manera de hacer esto?

realmente lo que estoy esperando es algo tan suave como esta:

#!/usr/bin/python 
import sys.path 
from os.path import pardir, sep 
sys.path.append_relative(pardir + sep + "lib") 

import mylib 

O mejor aún, algo que no se rompería cuando mi editor (u otra persona que tiene acceso) decide reordenar las importaciones como parte de su proceso de limpieza:

#!/usr/bin/python --relpath_append ../lib 
import mylib 

Eso no sería directamente al puerto de plataformas no POSIX, pero sería mantener las cosas limpias.

+0

Ver también: http://stackoverflow.com/questions/2349991/python-how-to-import-other-python-files/20749411#20749411 – dreftymac

Respuesta

13

Si no quiere editar cada archivo

  • instalar la biblioteca como una librería del pitón normales
    o
  • Establecer PYTHONPATH a su lib

o si está dispuesto a agregar una sola línea a cada archivo, agregue una declaración de importación en la parte superior, p.

mantener import_my_lib.py en bin y import_my_lib puede establecer correctamente la ruta de pitón a lo lib desea

72

Esto es lo que yo uso:

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 
9

crear un módulo envoltorio project/bin/lib, que contiene lo siguiente:

import sys, os 

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')) 

import mylib 

del sys.path[0], sys, os 

entonces se puede sustituir la totalidad el cruft en la parte superior de sus scripts con:

#!/usr/bin/python 
from lib import mylib 
4

Si no desea cambiar el contenido de la escritura en cualquier forma, anteponga el directorio de trabajo actual . a $ PYTHONPATH (véase el ejemplo siguiente)

PYTHONPATH=.:$PYTHONPATH alembic revision --autogenerate -m "First revision" 

Y llamar a un día!

+0

https: //docs.python.org/3/tutorial/modules.html#the-module-search-path dice: "sys.path se inicializa desde estas ubicaciones: -El directorio que contiene el script de entrada". Creo que esto no es verdad – jms

9

que estoy usando:

import sys,os 
sys.path.append(os.getcwd()) 
Cuestiones relacionadas