Vou tentar abordar algumas variações dessa questão também:
- localizando o caminho do script chamado
- localizando o caminho do script atualmente em execução
- localizando o diretório do script chamado
(Algumas dessas perguntas foram feitas no SO, mas foram fechadas como duplicatas e redirecionadas aqui.)
Advertências de uso __file__
Para um módulo que você importou:
import something
something.__file__
retornará o caminho absoluto do módulo. No entanto, dado o seguinte script foo.py:
#foo.py
print '__file__', __file__
Chamando-o com 'python foo.py' Retornará simplesmente 'foo.py'. Se você adicionar um shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
e chame-o usando ./foo.py, ele retornará './foo.py'. Chamando-o de um diretório diferente (por exemplo, coloque foo.py na barra de diretórios) e, em seguida, chamando
python bar/foo.py
ou adicionando um shebang e executando o arquivo diretamente:
bar/foo.py
retornará 'bar / foo.py' (o parente caminho ).
Localizando o diretório
Agora, a partir daí, para obter o diretório, os.path.dirname(__file__)
também pode ser complicado. Pelo menos no meu sistema, ele retornará uma string vazia se você a chamar do mesmo diretório que o arquivo. ex.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
irá produzir:
__file__ is: foo.py
os.path.dirname(__file__) is:
Em outras palavras, ele retorna uma cadeia vazia, portanto, isso não parece confiável se você deseja usá-la para o arquivo atual (ao contrário do arquivo de um módulo importado). Para contornar isso, você pode envolvê-lo em uma chamada para abspath:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
que gera algo como:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Observe que abspath () NÃO resolve links simbólicos. Se você quiser fazer isso, use realpath (). Por exemplo, criando um link simbólico file_import_testing_link apontando para file_import_testing.py, com o seguinte conteúdo:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
A execução imprimirá caminhos absolutos, como:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Usando inspecionar
O @SummerBreeze menciona o uso do módulo inspecionar .
Isso parece funcionar bem e é bastante conciso para os módulos importados:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
obedientemente retorna o caminho absoluto. No entanto, para encontrar o caminho do script em execução no momento, não vi uma maneira de usá-lo.