Eu costumava abrir arquivos que estavam no mesmo diretório do script Python em execução no momento, simplesmente usando um comando como
open("Some file.txt", "r")
No entanto, descobri que, quando o script era executado no Windows, clicando duas vezes nele, tentava abrir o arquivo do diretório errado.
Desde então, eu usei um comando do formulário
open(os.path.join(sys.path[0], "Some file.txt"), "r")
sempre que eu queria abrir um arquivo. Isso funciona para meu uso específico, mas não tenho certeza se sys.path[0]
pode falhar em outro caso de uso.
Portanto, minha pergunta é: Qual é a melhor e mais confiável maneira de abrir um arquivo que está no mesmo diretório do script Python em execução no momento?
Aqui está o que eu consegui descobrir até agora:
os.getcwd()
eos.path.abspath('')
retorne o "diretório de trabalho atual", não o diretório de scripts.os.path.dirname(sys.argv[0])
eos.path.dirname(__file__)
retorne o caminho usado para chamar o script, que pode ser relativo ou mesmo em branco (se o script estiver no cwd). Além disso,__file__
não existe quando o script é executado no IDLE ou no PythonWin.sys.path[0]
eos.path.abspath(os.path.dirname(sys.argv[0]))
parece retornar o diretório de scripts. Não tenho certeza se há alguma diferença entre esses dois.
Editar:
Acabei de perceber que o que eu quero fazer seria melhor descrito como "abra um arquivo no mesmo diretório que o módulo que o contém". Em outras palavras, se eu importar um módulo que escrevi que esteja em outro diretório e esse módulo abrir um arquivo, quero que ele procure o arquivo no diretório do módulo. Acho que nada que eu encontrei é capaz de fazer isso ...
__file__
não puder ser usado, use emsys.argv[0]
vez dedirname(__file__)
. O resto deve funcionar como esperado. Eu gosto de usar__file__
porque no código da biblioteca,sys.argv[0]
talvez não aponte para o seu código, especialmente se importado por algum script de terceiros.