De onde o sys.path do Python é inicializado?
UPD : Python está adicionando alguns caminhos antes de se referir a PYTHONPATH:
>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
'c:\\testdir',
'C:\\Windows\\system32\\python25.zip',
'C:\\Python25\\DLLs',
'C:\\Python25\\lib',
'C:\\Python25\\lib\\plat-win',
'C:\\Python25\\lib\\lib-tk',
'C:\\Python25',
'C:\\Python25\\lib\\site-packages',
'C:\\Python25\\lib\\site-packages\\PIL',
'C:\\Python25\\lib\\site-packages\\win32',
'C:\\Python25\\lib\\site-packages\\win32\\lib',
'C:\\Python25\\lib\\site-packages\\Pythonwin']
Meu PYTHONPATH é:
PYTHONPATH=c:\testdir
Eu me pergunto de onde vêm esses caminhos anteriores aos de PYTHONPATH?
Python realmente se esforça para definir de forma inteligente
sys.path
. A configuração pode ser muito complicada . O seguinte guia é um pouco incompleto guia aguado,, um pouco-errado, mas espero-útil para o programador python rank-and-file do que acontece quando figuras python para fora o que usar como os valores iniciais desys.path
,sys.executable
,sys.exec_prefix
, esys.prefix
em uma instalação normal do python.Primeiro, o python dá o melhor de si para descobrir sua localização física real no sistema de arquivos com base no que o sistema operacional diz. Se o sistema operacional apenas disser que "python" está em execução, ele se encontrará em $ PATH. Ele resolve quaisquer links simbólicos. Depois de fazer isso, o caminho do executável que encontrar é usado como o valor para
sys.executable
, sem ifs, ands ou buts.Em seguida, ele determina os valores iniciais para
sys.exec_prefix
esys.prefix
.Se houver um arquivo chamado
pyvenv.cfg
no mesmo diretóriosys.executable
ou em um diretório acima, o python o examina. Sistemas operacionais diferentes fazem coisas diferentes com este arquivo.Um dos valores neste arquivo de configuração que o python procura é a opção de configuração
home = <DIRECTORY>
. O Python usará esse diretório em vez do diretório que o contém,sys.executable
quando definir dinamicamente o valor inicialsys.prefix
posterior. Se aapplocal = true
configuração for exibida nopyvenv.cfg
arquivo no Windows, mas não ahome = <DIRECTORY>
configuração,sys.prefix
será definida para o diretório que contémsys.executable
.Em seguida, a
PYTHONHOME
variável de ambiente é examinada. No Linux e Mac,sys.prefix
esys.exec_prefix
são definidos com aPYTHONHOME
variável de ambiente, se houver, substituindo qualquerhome = <DIRECTORY>
configuração empyvenv.cfg
. No Windows,sys.prefix
esys.exec_prefix
é definido com aPYTHONHOME
variável de ambiente, se existir, a menos que umahome = <DIRECTORY>
configuração esteja presente empyvenv.cfg
, que é usada em seu lugar.Caso contrário, estes
sys.prefix
esys.exec_prefix
são encontrados caminhando para trás a partir da localizaçãosys.executable
ou dohome
diretório fornecido por,pyvenv.cfg
se houver.Se o arquivo
lib/python<version>/dyn-load
for encontrado nesse diretório ou em qualquer um de seus diretórios pais, esse diretório será definido comosys.exec_prefix
Linux ou Mac. Se o arquivolib/python<version>/os.py
for encontrado no diretório ou em qualquer um de seus subdiretórios, esse diretório será definido para estarsys.prefix
no Linux, Mac e Windows, comsys.exec_prefix
o mesmo valor definidosys.prefix
no Windows. Toda esta etapa é ignorada no Windows seapplocal = true
estiver configurada. O diretório desys.executable
é usado ou, sehome
estiver definido empyvenv.cfg
, será usado em vez do valor inicial desys.prefix
.Se ele não puder encontrar esses arquivos de "referência" ou
sys.prefix
ainda não tiver sido encontrado, o python definesys.prefix
um valor de "fallback". Linux e Mac, por exemplo, usam padrões pré-compilados como os valores desys.prefix
esys.exec_prefix
. O Windows espera até quesys.path
seja totalmente descoberto para definir um valor de fallback parasys.prefix
.Então, (o que todos vocês estavam esperando), o python determina os valores iniciais que devem ser contidos
sys.path
.sys.path
. No Windows, é sempre a string vazia, que diz ao python para usar o caminho completo onde o script está localizado.sys.path
, a menos que você esteja no Windows eapplocal
esteja definido como verdadeiro empyvenv.cfg
.<prefix>/lib/python35.zip
no Linux / Mac eos.path.join(os.dirname(sys.executable), "python.zip")
no Windows, é adicionado asys.path
.applocal = true
sido definidopyvenv.cfg
, o conteúdo das subchaves da chave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
será adicionado, se houver.applocal = true
foi definidopyvenv.cfg
esys.prefix
não pôde ser encontrado, o conteúdo principal da chave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
é adicionado, se existir;applocal = true
sido definidopyvenv.cfg
, o conteúdo das subchaves da chave de registroHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
será adicionado, se houver.applocal = true
foi definidopyvenv.cfg
esys.prefix
não pôde ser encontrado, o conteúdo principal da chave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
é adicionado, se existir;sys.prefix
.sys.exec_prefix
é adicionado. No Windows, o diretório que foi usado (ou teria sido usado) para pesquisar dinamicamentesys.prefix
foi adicionado.Neste estágio no Windows, se nenhum prefixo for encontrado, o python tentará determiná-lo pesquisando todos os diretórios em
sys.path
busca dos arquivos de referência, como tentou fazer com o diretóriosys.executable
anterior, até encontrar algo. Caso contrário,sys.prefix
é deixado em branco.Finalmente, depois de tudo isso, o Python carrega o
site
módulo, que adiciona coisas ainda mais asys.path
:fonte
sys.executable
pode ser um link simbólico ou, na verdade, pode ser qualquer coisa seargv[0]
contiver barras. O caminho real para o executável (daexecv(path, argv)
chamada) não é usado.sys.path
no Windows 10: Eu sempre obtenho o caminho completo do meu diretório de script como sys.path [0] (não cwd ''). Você deve ser capaz de executar algo comopython some\other\path\than\cwd\main.py
site-packages
têm.pth
e.egg-link
sufixos.