Pode parecer uma pergunta para iniciantes, mas não é. Algumas abordagens comuns não funcionam em todos os casos:
sys.argv [0]
Isso significa usar path = os.path.abspath(os.path.dirname(sys.argv[0]))
, mas isso não funciona se você estiver executando em outro script Python em outro diretório, e isso pode acontecer na vida real.
__Arquivo__
Isso significa usar path = os.path.abspath(os.path.dirname(__file__))
, mas descobri que isso não funciona:
py2exe
não tem um__file__
atributo, mas há uma solução alternativa- Quando você executa a partir do IDLE com
execute()
nenhum__file__
atributo - OS X 10.6 onde eu recebo
NameError: global name '__file__' is not defined
Perguntas relacionadas com respostas incompletas:
- Python - Encontre o caminho para o arquivo sendo executado
- O caminho para o arquivo atual depende de como eu executo o programa
- Como saber o caminho do script em execução no Python?
- Mude o diretório para o diretório de um script Python
Estou procurando uma solução genérica , que funcionaria em todos os casos de uso acima.
Atualizar
Aqui está o resultado de um testcase:
Saída de python a.py (no Windows)
a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz
b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz
a.py
#! /usr/bin/env python
import os, sys
print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print
execfile("subdir/b.py")
subdir / b.py
#! /usr/bin/env python
import os, sys
print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print
árvore
C:.
| a.py
\---subdir
b.py
NameError: global name '__file__' is not defined
uso o arquivo e isso não está dentro do IDLE. Pense que isso__file__
é definido apenas dentro dos módulos.