Onde está o sys.path do Python inicializada a partir de?
Pergunta
Onde está o sys.path do Python inicializada a partir de?
UPD : Python é a adição de alguns caminhos antes de se referindo 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']
O meu PYTHONPATH é:
PYTHONPATH=c:\testdir
Gostaria de saber onde esses caminhos antes queridos do PythonPath vem?
Solução
"inicializado a partir da variável de ambiente PYTHONPATH, além de um padrão dependente da instalação"
Outras dicas
Python realmente se esforça para definir de forma inteligente sys.path
. Como é
conjunto pode obter realmente complicado . O guia a seguir é uma aguada,
um pouco incompleto, algo-errado, mas guia espero-útil
para o programador python rank-and-file do que acontece quando python
descobre o que usar como valores iniciais de sys.path
,
sys.executable
, sys.exec_prefix
e sys.prefix
em um normais
python instalação.
Em primeiro lugar, python faz o seu melhor nível para descobrir o seu físico real
localização no sistema de arquivos com base no que o sistema operacional diz
isto. Se o OS apenas diz "python" é executado, ele encontra-se em $ PATH.
Ele resolve todos os links simbólicos. Uma vez que tenha feito isso, o caminho da
o executável que ele encontra é usado como o valor para sys.executable
, não 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 uma pasta acima, olhares python para ele. Diferente
SOs fazer coisas diferentes com este arquivo.
Um dos valores neste arquivo de configuração que a aparência Python para é
o home = <DIRECTORY>
opção de configuração. Python usará este diretório em vez do diretório contendo sys.executable
quando se dinamicamente define o valor inicial de sys.prefix
mais tarde. Se a definição applocal = true
aparece no
arquivo pyvenv.cfg
no Windows, mas não a configuração home = <DIRECTORY>
,
em seguida, sys.prefix
será definido para o contendo sys.executable
diretório.
A seguir, a variável de ambiente PYTHONHOME
é examinado. No Linux e Mac,
sys.prefix
e sys.exec_prefix
estão definidos para a variável de ambiente PYTHONHOME
, se
ele existe, superação qualquer configuração home = <DIRECTORY>
em pyvenv.cfg
. No Windows,
sys.prefix
e sys.exec_prefix
está definido para a variável de ambiente PYTHONHOME
,
se existir, menos a configuração home = <DIRECTORY>
está presente em pyvenv.cfg
,
que é usado em seu lugar.
Caso contrário, estes sys.prefix
e sys.exec_prefix
são encontrados por andar para trás
a partir da localização de sys.executable
ou o diretório home
dada pelo pyvenv.cfg
se houver.
Se o lib/python<version>/dyn-load
arquivo for encontrado nesse diretório
ou qualquer de seus diretórios pai, esse diretório está definido para ser para ser
sys.exec_prefix
no Linux ou Mac. Se o arquivo
lib/python<version>/os.py
é é encontrado no diretório ou qualquer dos seus
subdiretórios, esse diretório está definido para ser sys.prefix
em Linux,
Mac e Windows, com o conjunto sys.exec_prefix
para o mesmo valor como
sys.prefix
no Windows. Todo esse passo é ignorado no Windows se
applocal = true
está definido. O diretório de sys.executable
é
utilizado ou, se home
é definido em pyvenv.cfg
, que é usado em vez de
o valor inicial de sys.prefix
.
Se não pode encontrar esses arquivos "marco" ou sys.prefix
não foi
encontrado ainda, então conjuntos python sys.prefix
a um "retorno"
valor. defaults Linux e Mac, por exemplo, o uso pré-compilados como o
valores de sys.prefix
e sys.exec_prefix
. esperas do Windows
até sys.path
está totalmente descoberto para definir um valor alternativo para
sys.prefix
.
Então, (o que você tem tudo que espera para,) python determina os valores iniciais
que estão a ser contido no sys.path
.
- O diretório do script que python está em execução é adicionado à
sys.path
. No Windows, isso é sempre a cadeia vazia, que conta python para usar o caminho completo onde o script está localizado em seu lugar. - O conteúdo da variável de ambiente PYTHONPATH, se estiver definido, é adicionado ao
sys.path
, menos você está no Windows eapplocal
é definido como verdadeiro empyvenv.cfg
. - O caminho do arquivo zip, que é
<prefix>/lib/python35.zip
em Linux / Mac eos.path.join(os.dirname(sys.executable), "python.zip")
no Windows, é adicionado aosys.path
. - Se no Windows e não
applocal = true
foi criado empyvenv.cfg
, em seguida, o conteúdo das subchaves da chave de registroHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
são adicionadas, se for o caso. - Se no Windows e não
applocal = true
foi criado empyvenv.cfg
esys.prefix
não pôde ser encontrado, em seguida, os conteúdo do núcleo do daHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
chave de registro é adicionado, se existir; - Se no Windows e não
applocal = true
foi criado empyvenv.cfg
, em seguida, o conteúdo das subchaves da chave de registroHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
são adicionadas, se for o caso. - Se no Windows e não
applocal = true
foi criado empyvenv.cfg
esys.prefix
não pôde ser encontrado, em seguida, os conteúdo do núcleo do daHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
chave de registro é adicionado, se existir; - Se no Windows, e PYTHONPATH não foi definido, o prefixo não foi encontrado, e há chaves de registro estavam presentes, então o valor de tempo de compilação relativa de PYTHONPATH é adicionado; caso contrário, este passo é ignorado.
- Caminhos do tempo de compilação PYTHONPATH macro são adicionados em relação ao
sys.prefix
dinamicamente encontrado. - No Mac e Linux, é adicionado o valor de
sys.exec_prefix
. No Windows, o diretório que foi usado (ou teria sido usado) para procurar dinamicamente parasys.prefix
é acrescentou.
Nesta fase no Windows, se nenhum prefixo foi encontrado, então python vai tentar
determiná-lo por pesquisa todas os diretórios em sys.path
para os arquivos de referência,
como ele tentou fazer com o diretório de sys.executable
anteriormente, até encontrar alguma coisa.
Se isso não acontecer, sys.prefix
está em branco esquerdo.
Finalmente, depois de tudo isto, Python carrega o módulo site
, que adiciona coisas ainda mais para sys.path
:
Ela começa com a construção de até quatro diretórios de uma cabeça e um parte da cauda. Para a parte da cabeça, ele usa
sys.prefix
esys.exec_prefix
; cabeças vazias são ignorados. Para a parte da cauda, ??ele usa a cadeia vazia elib/site-packages
então (no Windows) oulib/pythonX.Y/site-packages
elib/site-python
então (em Unix e Macintosh). Para cada um dos combinações de cabeça-cauda distintos, que se vê, refere-se a um existente diretório, e se assim for, adiciona-o sys.path e também inspeciona o recém caminho adicional para arquivos de configuração.