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 de sys.path
,
sys.executable
, sys.exec_prefix
, e sys.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
e
sys.prefix
.
Se houver um arquivo chamado pyvenv.cfg
no mesmo diretório
sys.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 inicial sys.prefix
posterior. Se a applocal = true
configuração for exibida no
pyvenv.cfg
arquivo no Windows, mas não a home = <DIRECTORY>
configuração, sys.prefix
será definida para o diretório que contém sys.executable
.
Em seguida, a PYTHONHOME
variável de ambiente é examinada. No Linux e Mac,
sys.prefix
e sys.exec_prefix
são definidos com a PYTHONHOME
variável de ambiente, se houver, substituindo qualquer home = <DIRECTORY>
configuração em pyvenv.cfg
. No Windows,
sys.prefix
e sys.exec_prefix
é definido com a PYTHONHOME
variável de ambiente, se existir, a menos que uma home = <DIRECTORY>
configuração esteja presente em pyvenv.cfg
, que é usada em seu lugar.
Caso contrário, estes sys.prefix
e sys.exec_prefix
são encontrados caminhando para trás a partir da localização sys.executable
ou do home
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 como
sys.exec_prefix
Linux ou Mac. Se o arquivo
lib/python<version>/os.py
for encontrado no diretório ou em qualquer um de seus subdiretórios, esse diretório será definido para estar sys.prefix
no Linux, Mac e Windows, com sys.exec_prefix
o mesmo valor definido
sys.prefix
no Windows. Toda esta etapa é ignorada no Windows se
applocal = true
estiver configurada. O diretório de sys.executable
é usado ou, se home
estiver definido em pyvenv.cfg
, será usado em vez do valor inicial de sys.prefix
.
Se ele não puder encontrar esses arquivos de "referência" ou sys.prefix
ainda não tiver sido encontrado, o python define sys.prefix
um valor de "fallback". Linux e Mac, por exemplo, usam padrões pré-compilados como os valores de sys.prefix
e sys.exec_prefix
. O Windows espera até que sys.path
seja totalmente descoberto para definir um valor de fallback para
sys.prefix
.
Então, (o que todos vocês estavam esperando), o python determina os valores iniciais que devem ser contidos sys.path
.
- O diretório do script que o python está executando é adicionado
sys.path
. No Windows, é sempre a string vazia, que diz ao python para usar o caminho completo onde o script está localizado.
- O conteúdo da variável de ambiente PYTHONPATH, se definido, é adicionado a
sys.path
, a menos que você esteja no Windows e applocal
esteja definido como verdadeiro em pyvenv.cfg
.
- O caminho do arquivo zip, que está
<prefix>/lib/python35.zip
no Linux / Mac e
os.path.join(os.dirname(sys.executable), "python.zip")
no Windows, é adicionado a sys.path
.
- Se estiver no Windows e não tiver
applocal = true
sido definido pyvenv.cfg
, o conteúdo das subchaves da chave de registro
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
será adicionado, se houver.
- Se no Windows e nenhum
applocal = true
foi definido pyvenv.cfg
e sys.prefix
não pôde ser encontrado, o conteúdo principal da chave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
é adicionado, se existir;
- Se estiver no Windows e não tiver
applocal = true
sido definido pyvenv.cfg
, o conteúdo das subchaves da chave de registro
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
será adicionado, se houver.
- Se no Windows e nenhum
applocal = true
foi definido pyvenv.cfg
e sys.prefix
não pôde ser encontrado, o conteúdo principal da chave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
é adicionado, se existir;
- Se no Windows e PYTHONPATH não foi definido, o prefixo não foi encontrado, e nenhuma chave de registro estava presente, então o valor de tempo de compilação relativo de PYTHONPATH é adicionado; caso contrário, esta etapa é ignorada.
- Os caminhos na macro de tempo de compilação PYTHONPATH são adicionados em relação ao encontrado dinamicamente
sys.prefix
.
- No Mac e no Linux, o valor de
sys.exec_prefix
é adicionado. No Windows, o diretório que foi usado (ou teria sido usado) para pesquisar dinamicamente sys.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ório sys.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 a sys.path
:
Ele começa construindo até quatro diretórios de uma parte inicial e uma parte final. Para a parte da cabeça, use sys.prefix
e sys.exec_prefix
; cabeças vazias são ignoradas. Para a parte final, ele usa a string vazia e então lib/site-packages
(no Windows) ou lib/pythonX.Y/site-packages
e então lib/site-python
(no Unix e Macintosh). Para cada uma das combinações head-tail distintas, ele vê se se refere a um diretório existente e, em caso afirmativo, adiciona-o a sys.path e também inspeciona o caminho recém-adicionado para arquivos de configuração.