Como faço para obter o caminho eo nome do arquivo que está atualmente em execução?

votos
370

I tiver scripts chamar outros arquivos de script, mas eu preciso para obter o filepath do arquivo que está sendo executado dentro do processo.

Por exemplo, digamos que eu tenho três arquivos. Usando execfile :

  • script_1.pychama script_2.py.
  • Por sua vez, script_2.pychama script_3.py.

Como posso obter o nome do arquivo eo caminho script_3.py, a partir do código dentroscript_3.py , sem ter que passar essa informação como argumentos a partir de script_2.py?

(Execução de os.getcwd()retornos filepath do roteiro original de partida não o arquivo atual.)

Publicado 08/09/2008 em 20:41
fonte usuário
Em outras línguas...                            


24 respostas

votos
448
__file__

como já foi dito. Você também pode querer usar os.path.realpath para eliminar links simbólicos:

import os

os.path.realpath(__file__)
Respondeu 23/12/2009 em 21:33
fonte usuário

votos
213

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
Respondeu 09/09/2008 em 00:02
fonte usuário

votos
61

Aqui está um experimento com base nas respostas neste tópico - com Python 2.7.10 no Windows.

Os baseado em pilha são os únicos que parecem dar resultados confiáveis. Os dois últimos têm a sintaxe mais curta , ou seja -

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

Aqui é para estes a ser adicionado a sys como funções! Crédito para @Usagi e @pablog

Com base no seguinte três arquivos, e executar script1.py de sua pasta com python script1.py(execfiles também tentaram com caminhos absolutos e chamando a partir de uma pasta 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
Respondeu 06/08/2015 em 22:50
fonte usuário

votos
59

Acho que este é mais limpo:

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

e obtém a mesma informação que:

print inspect.getfile(inspect.currentframe())

Onde [0] é o quadro atual na pilha (topo da pilha) e [1] é o nome do arquivo, aumento de ir para trás no ie pilha

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

seria o nome do script que chama o quadro atual arquivo. Além disso, usando [-1], poderá ir para o fundo da pilha, o script chamado original.

Respondeu 08/07/2011 em 18:50
fonte usuário

votos
33
import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only
Respondeu 06/02/2015 em 01:05
fonte usuário

votos
32

As sugestões marcados como melhor são todos verdadeiro se o seu script consiste em um único arquivo.

Se você quiser descobrir o nome do executável (ou seja, o arquivo raiz passado para o interpretador Python para o programa atual) de um arquivo que pode ser importado como um módulo, você precisa fazer isso (vamos supor que este é em um arquivo chamado foo.py ):

import inspect

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

Porque a última coisa ( [-1]) na pilha é a primeira coisa que foi para ele (pilhas são estruturas de dados LIFO / FILO).

Então, em arquivo bar.py se você import foovai imprimir bar.py , ao invés de foo.py , o que seria o valor de todos estes:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
Respondeu 26/02/2010 em 23:25
fonte usuário

votos
13
import os
print os.path.basename(__file__)

isso nos dará somente o nome do arquivo. ou seja, se abspath de arquivo é C: \ abcd \ abc.py seguida, 2ª linha será impresso abc.py

Respondeu 11/08/2013 em 04:05
fonte usuário

votos
11

Não é inteiramente claro o que você quer dizer com "o caminho de arquivo do arquivo que está sendo executado dentro do processo". sys.argv[0]geralmente contém a localização do script que foi invocado pelo interpretador Python. Verifique a documentação sys para mais detalhes.

Como @ Tim e @Pat Notz têm apontado, o atributo __file__ fornece acesso a

o arquivo a partir do qual o módulo foi carregado, se ele foi carregado a partir de um arquivo

Respondeu 08/09/2008 em 20:42
fonte usuário

votos
8

Eu tenho um script que deve trabalhar em ambiente Windows. Este código snipped é o que eu terminei com:

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

é bem uma decisão hacky. Mas não requer bibliotecas externas e é a coisa mais importante no meu caso.

Respondeu 08/08/2012 em 10:42
fonte usuário

votos
7

O __file__atributo funciona tanto para o arquivo que contém o código de execução principal, bem como módulos importados.

veja https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

Respondeu 08/09/2008 em 20:56
fonte usuário

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

Não há necessidade de inspecionar ou qualquer outra biblioteca.

Isso funcionou para mim quando eu tinha para importar um script (a partir de um diretório diferente, em seguida, o script executado), que usou um arquivo de configuração que residem na mesma pasta que o script importado.

Respondeu 24/06/2014 em 16:04
fonte usuário

votos
5
import sys

print sys.path[0]

isso iria imprimir o caminho do script atualmente em execução

Respondeu 02/01/2010 em 19:34
fonte usuário

votos
5

Eu acho que é apenas __file__ Parece que você também pode querer check-out do módulo inspecionar .

Respondeu 08/09/2008 em 20:44
fonte usuário

votos
4

Você pode 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'
Respondeu 09/09/2008 em 01:00
fonte usuário

votos
3
import sys
print sys.argv[0]
Respondeu 19/04/2010 em 08:47
fonte usuário

votos
2

Isso deve funcionar:

import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
Respondeu 14/06/2015 em 16:37
fonte usuário

votos
1

Para manter a consistência da migração entre plataformas (MacOS / Windows / Linux), tente:

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

Respondeu 12/04/2018 em 05:19
fonte usuário

votos
0

maneira mais simples é:

em script_1.py:

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

em script_2.py:

sys.argv[0]

PS: Eu tentei execfile, mas desde que ele lê script_2.py como uma string, sys.argv[0]retornou <string>.

Respondeu 08/06/2018 em 12:29
fonte usuário

votos
0

Para obter o diretório do script de execução

 print os.path.dirname( inspect.getfile(inspect.currentframe()))
Respondeu 10/05/2017 em 10:51
fonte usuário

votos
0

Eu escrevi uma função que levam em consideração eclipse depurador e unittest . -Lo retornar a pasta do primeiro script que você lançar. Opcionalmente, você pode especificar o __file__ var, mas o principal é que você não tem que compartilhar esta variável em todos sua hierarquia de chamadas .

Talvez você pode lidar com outros empilhar casos particulares eu não vi, mas para mim é ok.

import inspect, os
def getRootDirectory(_file_=None):
    """
    Get the directory of the root execution file
    Can help: http://stackoverflow.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_))
Respondeu 14/06/2016 em 15:06
fonte usuário

votos
0

Eu usei a abordagem com __file__
os.path.abspath(__file__)
mas há um pequeno truque, ele retorna o arquivo .py quando o código é executado pela primeira vez, próximas corridas dar o nome do arquivo * .pyc
então eu fiquei com:
inspect.getfile(inspect.currentframe())
ou
sys._getframe().f_code.co_filename

Respondeu 01/03/2011 em 10:23
fonte usuário

votos
-1

A maioria destas respostas foram escritos em Python versão 2.x ou anterior. Em Python 3.x a sintaxe para a função de impressão mudou para exigir parênteses, isto é print ().

Assim, esta resposta alta pontuação no início do user13993 em 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

Torna-se em 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
Respondeu 09/11/2018 em 01:15
fonte usuário

votos
-1
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)
Respondeu 24/01/2013 em 03:43
fonte usuário

votos
-1

se você quiser apenas o nome do arquivo sem ./ou .pyvocê pode tentar este

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

file_name imprimirá testscript você pode gerar o que quiser, alterando o índice dentro []

Respondeu 20/01/2013 em 21:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more