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?

Foi útil?

Solução

"inicializado a partir da variável de ambiente PYTHONPATH, além de um padrão dependente da instalação"

- http://docs.python.org/library/sys. html # sys.path

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.

  1. 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.
  2. O conteúdo da variável de ambiente PYTHONPATH, se estiver definido, é adicionado ao sys.path, menos você está no Windows e applocal é definido como verdadeiro em pyvenv.cfg.
  3. O caminho do arquivo zip, que é <prefix>/lib/python35.zip em Linux / Mac e os.path.join(os.dirname(sys.executable), "python.zip") no Windows, é adicionado ao sys.path.
  4. Se no Windows e não applocal = true foi criado em pyvenv.cfg, em seguida, o conteúdo das subchaves da chave de registro HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ são adicionadas, se for o caso.
  5. Se no Windows e não applocal = true foi criado em pyvenv.cfg e sys.prefix não pôde ser encontrado, em seguida, os conteúdo do núcleo do da HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ chave de registro é adicionado, se existir;
  6. Se no Windows e não applocal = true foi criado em pyvenv.cfg, em seguida, o conteúdo das subchaves da chave de registro HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ são adicionadas, se for o caso.
  7. Se no Windows e não applocal = true foi criado em pyvenv.cfg e sys.prefix não pôde ser encontrado, em seguida, os conteúdo do núcleo do da HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ chave de registro é adicionado, se existir;
  8. 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.
  9. Caminhos do tempo de compilação PYTHONPATH macro são adicionados em relação ao sys.prefix dinamicamente encontrado.
  10. 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 para sys.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 e sys.exec_prefix; cabeças vazias são ignorados. Para a parte da cauda, ??ele usa a cadeia vazia e lib/site-packages então (no Windows) ou lib/pythonX.Y/site-packages e lib/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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top