Com a ajuda do e-mail do Guido fornecido por @kindall, podemos entender o processo de importação padrão como tentar encontrar o módulo em cada membro de sys.path, e arquivo como resultado desta consulta (mais detalhes em Módulos PyMOTW e Importações .). Portanto, se o módulo está localizado em um caminho absoluto, sys.patho resultado é absoluto, mas se ele está localizado em um caminho relativo, sys.patho resultado é relativo.
Agora, o site.pyarquivo de inicialização se encarrega de entregar apenas o caminho absoluto sys.path, exceto o inicial '', então se você não alterá-lo por outro meio que não seja definindo o PYTHONPATH (cujo caminho também é feito absoluto, antes de prefixar sys.path), você obterá sempre um absoluto caminho, mas quando o módulo é acessado através do diretório atual.
Agora, se você enganar o sys.path de uma maneira engraçada, poderá conseguir qualquer coisa.
Como exemplo, se você tem um módulo de exemplo foo.pyno /tmp/com o código:
import sys
print(sys.path)
print (__file__)
Se você entrar em / tmp, obterá:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
Quando em /home/user, se você adicionar /tmpseu, PYTHONPATHvocê terá:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
Mesmo se você adicionar ../../tmp, ele será normalizado e o resultado será o mesmo.
Mas se em vez de usar PYTHONPATHvocê usar diretamente algum caminho engraçado você obtém um resultado tão engraçado quanto a causa.
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
Guido explica no tópico citado acima, por que o python não tenta transformar todas as entradas em caminhos absolutos:
não queremos ter que chamar getpwd () em cada importação .... getpwd () é relativamente lento e às vezes pode falhar completamente,
Portanto, seu caminho é usado como está .