Tengo un directorio lleno de scripts (digamos project/bin
). También tengo una biblioteca ubicada project/lib
y quiero que los scripts la carguen automáticamente. Esto es lo que normalmente uso en la parte superior de cada script:
#!/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
Esto es algo engorroso, feo y debe pegarse al principio de cada archivo. ¿Hay una mejor manera de hacer esto?
Realmente lo que espero es algo tan suave como esto:
#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")
import mylib
O incluso mejor, algo que no se rompería cuando mi editor (o alguien más que tenga acceso de confirmación) decida reordenar las importaciones como parte de su proceso de limpieza:
#!/usr/bin/python --relpath_append ../lib
import mylib
Eso no se trasladaría directamente a plataformas que no sean posix, pero mantendría las cosas limpias.
python
python-import
James Harr
fuente
fuente
Respuestas:
Si no desea editar cada archivo
o
PYTHONPATH
a sulib
o si está dispuesto a agregar una sola línea a cada archivo, agregue una declaración de importación en la parte superior, por ejemplo
manténgalo
import_my_lib.py
en la papelera yimport_my_lib
puede configurar correctamente la ruta de Python a lolib
que deseefuente
Esto es lo que uso:
fuente
__file__
es un nombre de archivo relativo al directorio de trabajo actual (por ejemplo,setup.py
), entoncesos.path.dirname(__file__)
será la cadena vacía. Por esta y preocupaciones similares planteada por John Jiang , ekhumoro Es más solución de propósito general es mucho más preferible.Estoy usando:
fuente
sys.path.append('.')
__file__
lugar, solo haga referencia como cualquier desarrollador cuasi sano.Cree un módulo contenedor
project/bin/lib
, que contenga esto:Luego puede reemplazar todo el cruft en la parte superior de sus scripts con:
fuente
Si no desea cambiar el contenido del script de ninguna manera, anteponga el directorio de trabajo actual
.
a $ PYTHONPATH (vea el ejemplo a continuación)¡Y llámalo un día!
fuente
Usando python 3.4+ Excluyendo
el uso de cx_freeze o usando en IDLE. 😃
fuente
Puede ejecutar el script
python -m
desde el directorio raíz correspondiente. Y pase la "ruta de los módulos" como argumento.Ejemplo:
$ python -m module.sub_module.main # Notice there is no '.py' at the end.
Otro ejemplo:
fuente
Hay un problema con cada respuesta proporcionada que se puede resumir como "simplemente agregue este encantamiento mágico al principio de su script. Vea lo que puede hacer con solo una línea o dos de código". ¡No funcionarán en todas las situaciones posibles!
Por ejemplo, uno de esos encantamientos mágicos usa file . Desafortunadamente, si empaqueta su script usando cx_Freeze o está usando IDLE, esto resultará en una excepción.
Otro encantamiento mágico de este tipo usa os.getcwd (). Esto solo funcionará si está ejecutando su script desde el símbolo del sistema y el directorio que contiene su script es el directorio de trabajo actual (es decir, usó el comando cd para cambiar al directorio antes de ejecutar el script). ¡Eh, dioses! Espero no tener que explicar por qué esto no funcionará si su script de Python está en la RUTA en algún lugar y lo ejecutó simplemente escribiendo el nombre de su archivo de script.
Afortunadamente, hay un encantamiento mágico que funcionará en todos los casos que he probado. Desafortunadamente, el encantamiento mágico es más que una o dos líneas de código.
Como puede ver, ¡no es una tarea fácil!
fuente
Este funciona mejor para mí. Utilizar:
En mac debería imprimir algo como:
Para obtener la ruta de abs al wd actual, este es mejor porque ahora puede subir si lo desea, así:
Y ahora:
Entonces, si quieres importar
utils
desde aquí,'/Users/<your username>/'
todo lo que te queda por hacer es:
fuente
Veo un shebang en tu ejemplo. Si está ejecutando sus scripts bin como
./bin/foo.py
, en lugar depython ./bin/foo.py
, hay una opción de usar el shebang para cambiar$PYTHONPATH
variable.Sin embargo, no puede cambiar las variables de entorno directamente en shebangs, por lo que necesitará un pequeño script de ayuda. Pon esto
python.sh
en tubin
carpeta:Y luego cambia el shebang de tu
./bin/foo.py
para ser#!bin/python.sh
fuente
Cuando intentamos ejecutar un archivo python con la ruta desde la terminal.
Guarde el archivo (test.py).
Sistema de funcionamiento.
Abra el terminal y vaya al directorio donde está el archivo de guardado. a continuación, escribir
Pulsa Enter
Salida:
fuente
Yo suelo:
¡Entonces, puede usar cualquier directorio relativo!
addsitedir('..\lib')
; los dos puntos implican mover (arriba) un directorio primero.Recuerde que todo depende de cuál sea su directorio de trabajo actual desde el que comience. Si C: \ Joe \ Jen \ Becky, entonces addeditedir ('.. \ lib') importa a su ruta C: \ Joe \ Jen \ lib
fuente