2010-03-29 16 views
6

En Perl, el módulo FindBin se usa para localizar el directorio del script original. ¿Cuál es la forma canónica de obtener este directorio en Python?¿Cuál es el equivalente en Python de FindBin de Perl?

Algunas de las opciones que he visto:

  • os.path.dirname(os.path.realpath(sys.argv[0]))
  • os.path.abspath(os.path.dirname(sys.argv[0]))
  • os.path.abspath(os.path.dirname(__file__))
+0

No use FindBin: http://www.perlmonks.org/?node_id=41213 – runrig

+4

La queja de perlmonks es antigua y obsoleta. FindBin se creó porque, antes del advenimiento de/proc/PID/exe, se necesitaban heurísticas para encontrar la ruta del ejecutable actual. El quejoso tenía una heurística, que a menudo no siempre funcionaba. Hacia el final, se informó que la heurística FindBin se había mejorado. Ahora, usa/proc/PID/exe cuando está disponible, y en tales sistemas es más confiable que la queja en esa discusión de perlmonks. –

+0

Permítanme agregar a mi comentario de 3 años o más acerca de que FindBin sigue siendo útil, lo suficientemente útil como para que Perl FindBin esté ahora en la distribución central de perl: en mi humilde opinión aún más útil que FindBin es Dir :: Self de CPAN, que crea una pseudo-constante __DIR__ que se expande al directorio en el que se encuentra su archivo fuente (absoluto). FindBin solo funciona para el ejecutable; __DIR__ funciona para cualquier módulo. –

Respuesta

6

No consumo Python muy a menudo, así que no sé si hay paquete como FindBin pero

import os 
import sys 
bindir = os.path.abspath(os.path.dirname(sys.argv[0])) 

debería funcionar.

+0

Creo que usar 'FindBin' en lugar de $ 0 en Perl es ubicar el script incluso cuando se accede a él a través de un enlace. sys.argv [0] es casi idéntico a $ 0 y no funcionará para los enlaces. –

+0

Lo siento, estaba equivocado. Ambos no funcionarán para enlaces. –

+0

Uno de los usos principales de Perl FindBin y Dir :: Self _ _DIR_ _ es cargar módulos relativos al script o al módulo. Como en "use lib _ _DIR_ _" o "use lib $ FindBin :: RealBin" Hasta donde puedo decir, la respuesta aceptada para Python no se puede usar de esta manera. // La respuesta Python aceptada se puede usar para generar ejecutables relativamente. –

12

Puede probar esto:

import os 
bindir = os.path.abspath(os.path.dirname(__file__)) 

le dará la ruta absoluta del directorio del archivo actual.

0

Para actualizar en las respuestas anteriores, con Python 3.4+, ahora se puede hacer:

import pathlib 
bindir = pathlib.Path(__file__).resolve().parent 

que le dará el mismo, excepto que obtendrá un objeto de trazado que es mucho más agradable para trabajar con.

Cuestiones relacionadas