write obtener obtain from example python scripting file

python - obtener - ¿Cómo obtengo la ruta y el nombre del archivo que se está ejecutando actualmente?



python obtener path (24)

Tengo scripts que llaman a otros archivos de script, pero necesito obtener la ruta de archivo del archivo que se está ejecutando actualmente dentro del proceso.

Por ejemplo, digamos que tengo tres archivos. Utilizando execfile :

  • script_1.py llama a script_2.py .
  • A su vez, script_2.py llama a script_3.py .

¿Cómo puedo obtener el nombre de archivo y la ruta de script_3.py , desde el código dentro de script_3.py , sin tener que pasar esa información como argumentos de script_2.py ?

(La ejecución de os.getcwd() devuelve la os.getcwd() de archivo del script de inicio original, no la del archivo actual).


Aquí hay un experimento basado en las respuestas de este hilo, con Python 2.7.10 en Windows.

Los basados ​​en pila son los únicos que parecen dar resultados confiables. Los dos últimos tienen la sintaxis más corta , es decir:

print os.path.abspath(inspect.stack()[0][1]) # C:/testpath/lib/script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:/testpath/lib

¡A estos se añaden a sys como funciones! Crédito a @Usagi y @pablog

Basado en los siguientes tres archivos, y ejecutando script1.py desde su carpeta con python script1.py (también probé execfiles con rutas absolutas y llamando desde una carpeta separada).

C: / testpath / script1.py: execfile(''script2.py'')
C: / testpath / script2.py: execfile(''lib/script3.py'')
C: / testpath / lib / script3.py:

import sys import os import inspect print "Python " + sys.version print print __file__ # script1.py print sys.argv[0] # script1.py print inspect.stack()[0][1] # lib/script3.py print sys.path[0] # C:/testpath print print os.path.realpath(__file__) # C:/testpath/script1.py print os.path.abspath(__file__) # C:/testpath/script1.py print os.path.basename(__file__) # script1.py print os.path.basename(os.path.realpath(sys.argv[0])) # script1.py print print sys.path[0] # C:/testpath print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:/testpath print os.path.dirname(os.path.abspath(__file__)) # C:/testpath print os.path.dirname(os.path.realpath(sys.argv[0])) # C:/testpath print os.path.dirname(__file__) # (empty string) print print inspect.getfile(inspect.currentframe()) # lib/script3.py print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:/testpath/lib/script3.py print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:/testpath/lib print print os.path.abspath(inspect.stack()[0][1]) # C:/testpath/lib/script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:/testpath/lib print



Creo que esto es más limpio:

import inspect print inspect.stack()[0][1]

y obtiene la misma información que:

print inspect.getfile(inspect.currentframe())

Donde [0] es el fotograma actual en la pila (parte superior de la pila) y [1] es para el nombre del archivo, aumentar para ir hacia atrás en la pila, es decir

print inspect.stack()[1][1]

sería el nombre de archivo de la secuencia de comandos que llamó al marco actual. Además, usar [-1] te llevará al final de la pila, el script de llamada original.



Escribí una función que tiene en cuenta el depurador de eclipse y unittest . Devuelve la carpeta del primer script que inicie. Opcionalmente, puede especificar __file__ var, pero lo principal es que no tiene que compartir esta variable en toda su jerarquía de llamadas .

Tal vez puedas manejar otros casos de pila que no vi, pero para mí está bien.

import inspect, os def getRootDirectory(_file_=None): """ Get the directory of the root execution file Can help: http://.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing For eclipse user with unittest or debugger, the function search for the correct folder in the stack You can pass __file__ (with 4 underscores) if you want the caller directory """ # If we don''t have the __file__ : if _file_ is None: # We get the last : rootFile = inspect.stack()[-1][1] folder = os.path.abspath(rootFile) # If we use unittest : if ("/pysrc" in folder) & ("org.python.pydev" in folder): previous = None # We search from left to right the case.py : for el in inspect.stack(): currentFile = os.path.abspath(el[1]) if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile): break previous = currentFile folder = previous # We return the folder : return os.path.dirname(folder) else: # We return the folder according to specified __file__ : return os.path.dirname(os.path.realpath(_file_))


Esto debería funcionar:

import os,sys filename=os.path.basename(os.path.realpath(sys.argv[0])) dirname=os.path.dirname(os.path.realpath(sys.argv[0]))


La forma más sencilla es:

en script_1.py:

import subprocess subprocess.call([''python3'',<path_to_script_2.py>])

en script_2.py:

sys.argv[0]

PS: He intentado execfile , pero como lee script_2.py como una cadena, sys.argv[0] devolvió <string> .


La mayoría de estas respuestas fueron escritas en Python versión 2.xo anterior. En Python 3.x, la sintaxis de la función de impresión ha cambiado para requerir paréntesis, es decir, print ().

Entonces, esta respuesta de puntuación más alta del usuario 13993 en Python 2.x:

import inspect, os print inspect.getfile(inspect.currentframe()) # script filename (usually with path) print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory

Se convierte en Python 3.x:

import inspect, os print(inspect.getfile(inspect.currentframe())) # script filename (usually with path) print(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) ) # script directory


Las sugerencias marcadas como mejores son todas verdaderas si su secuencia de comandos consta de un solo archivo.

Si desea averiguar el nombre del ejecutable (es decir, el archivo raíz que se pasa al intérprete de python para el programa actual) desde un archivo que puede importarse como un módulo, debe hacer esto (supongamos que se trata de un archivo llamado foo.py ):

import inspect

print inspect.stack()[-1][1]

Porque lo último ( [-1] ) en la pila es lo primero que entró (las pilas son estructuras de datos LIFO / FILO).

Luego, en el archivo bar.py, si import foo , imprimirá bar.py , en lugar de foo.py , que sería el valor de todos estos:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]

No está del todo claro a qué se refiere con "la ruta de archivo del archivo que se está ejecutando actualmente dentro del proceso". sys.argv[0] normalmente contiene la ubicación del script que fue invocado por el intérprete de Python. Consulte la documentación del sistema para más detalles.

Como han señalado @Tim y @Pat Notz, el atributo __file__ proporciona acceso a

el archivo desde el que se cargó el módulo, si se cargó desde un archivo


Para mantener la coherencia de la migración en todas las plataformas (macOS / Windows / Linux), intente:

path = r''%s'' % os.getcwd().replace(''//',''/'')


Para obtener el directorio de ejecución de script

print os.path.dirname( inspect.getfile(inspect.currentframe()))


Puedes usar inspect.stack()

import inspect,os inspect.stack()[0] => (<frame object at 0x00AC2AC0>, ''g://Python//Test//_GetCurrentProgram.py'', 15, ''<module>'', [''print inspect.stack()[0]/n''], 0) os.path.abspath (inspect.stack()[0][1]) => ''g://Python//Test//_GetCurrentProgram.py''


Si solo desea el nombre de archivo sin ./ o .py , puede intentar esto

filename = testscript.py file_name = __file__[2:-3]

file_name imprimirá el script de prueba que puede generar lo que quiera cambiando el índice dentro de []


Tengo un script que debe funcionar en el entorno de Windows. Este código cortado es lo que he terminado con:

import os,sys PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])

Es una decisión bastante difícil. Pero no requiere bibliotecas externas y es lo más importante en mi caso.


Utilicé el enfoque con __file__
os.path.abspath(__file__)
pero hay un pequeño truco, devuelve el archivo .py cuando se ejecuta el código la primera vez, las siguientes ejecuciones dan el nombre del archivo * .pyc
así que me quedé con:
inspect.getfile(inspect.currentframe())
o
sys._getframe().f_code.co_filename


p1.py:

execfile("p2.py")

p2.py:

import inspect, os print inspect.getfile(inspect.currentframe()) # script filename (usually with path) print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory


__file__

como han dicho otros. También es posible que desee utilizar os.path.realpath para eliminar enlaces simbólicos:

import os os.path.realpath(__file__)


import os import wx # return the full path of this file print(os.getcwd()) icon = wx.Icon(os.getcwd() + ''/img/image.png'', wx.BITMAP_TYPE_PNG, 16, 16) # put the icon on the frame self.SetIcon(icon)


import os os.path.dirname(__file__) # relative directory path os.path.abspath(__file__) # absolute file path os.path.basename(__file__) # the file name only


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

No hay necesidad de inspeccionar o cualquier otra biblioteca.

Esto me funcionó cuando tuve que importar un script (desde un directorio diferente al script ejecutado), que usaba un archivo de configuración que residía en la misma carpeta que el script importado.


import os print os.path.basename(__file__)

Esto nos dará solo el nombre del archivo. es decir, si abspath del archivo es c: / abcd / abc.py, la segunda línea se imprimirá abc.py


import sys print sys.path[0]

Esto imprimiría la ruta del script que se está ejecutando actualmente.


import sys print sys.argv[0]