Pergunta

Outro desenvolvedor e eu discordamos sobre se PYTHONPATH ou sys.path deve ser usado para permitir Python para encontrar um pacote de Python em um usuário (por exemplo, desenvolvimento) anuário.

Temos um projeto Python com uma estrutura de diretório típico:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

Em script.py, o que precisamos fazer import package.lib. Quando o pacote é instalado no site-packages, script.py pode encontrar package.lib.

Ao trabalhar a partir de um diretório do usuário, no entanto, algo mais precisa ser feito. Minha solução é definir o meu PYTHONPATH para incluir "~ / Projeto". Outro desenvolvedor quer colocar esta linha de código no início do script.py:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Assim que o Python pode encontrar a cópia local do package.lib.

Eu acho que isso é uma má idéia, já que esta linha só é útil para desenvolvedores ou pessoas correndo de uma cópia local, mas não posso dar uma boa razão por que é uma má idéia.

Devemos usar PYTOHNPATH, sys.path, ou seja bem?

Foi útil?

Solução

Se a única razão para modificar o caminho é para desenvolvedores que trabalham a partir de sua árvore de trabalho, então você deve usar uma ferramenta de instalação para configurar o seu ambiente para você. virtualenv é muito popular, e se você estiver usando setuptools, você pode simplesmente executar setup.py develop para semi-instalar a árvore de trabalho em sua instalação atual do Python.

Outras dicas

Eu odeio PYTHONPATH. Acho que é frágil e irritante para conjunto em uma base por usuário (especialmente para usuários daemon) e manter o controle de como as pastas do projeto se mover. Eu prefiro muito mais definido sys.path nos scripts de invocação para projetos independentes.

No entanto sys.path.append não é a maneira de fazê-lo. Você pode facilmente obter duplicatas, e não resolver arquivos .pth. Melhor (e mais legível):. site.addsitedir

E script.py normalmente não seria o lugar mais adequado para fazê-lo, como é dentro do pacote que você deseja disponibilizar no caminho. módulos de biblioteca certamente não deve ser eles mesmos tocando sys.path. Em vez disso, você normalmente têm um script hashbanged fora do pacote que você usa para instanciar e executar o aplicativo, e é neste script wrapper trivial que você ia colocar detalhes de implantação like-frobbing sys.path.

Em geral, eu iria considerar a criação de uma variável de ambiente (como PYTHONPATH) a ser uma prática ruim. Embora isso possa ser bom para um fora de depuração, mas usando isso como
uma prática regular pode não ser uma boa idéia.

O uso de leads ambiente variáveis ??para situações como "ele funciona para mim" quando alguém
problemas relatórios outra parte do código base. Também se pode realizar a mesma prática com o ambiente de teste, bem como, levando a situações como os testes de corrida bom para um em particular desenvolvedor, mas provavelmente não quando alguém lança os testes.

Junto com as muitas outras razões já mencionadas, você também poderia apontar outh que embutir

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

é frágil porque presume a localização de script.py - ele só irá funcionar se script.py está localizado no Projeto / pacote. Ele vai quebrar se um usuário decide mover / copiar / symlink script.py (quase) qualquer outro lugar.

Eu acho, que, neste caso usando PYTHONPATH é uma coisa melhor, principalmente porque ela não introduz (questionável) de código desnecessária.

Depois de tudo, se você pensar sobre isso, o seu user não precisa essa coisa sys.path, porque o seu pacote será instalado em site-packages, porque você estará usando um sistema de embalagem.

Se os escolhe usuário para executar a partir de uma "cópia local", como lhe chamam, então, tenho observado que a prática usual é a de estado, que as necessidades de pacotes para ser adicionado ao PYTHONPATH manualmente, se usado fora da site-packages.

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