No Python 3.8, propõe-se adicionar uma alternativa aos ambientes virtuais - um diretório local com pacotes PEP 582 .
Este PEP sugere adicionar um mecanismo para detectar automaticamente o diretório __pypackages__
no Python e usá-lo ao importar como fonte de pacotes instalados. O diretório __pypackages__
terá uma prioridade mais alta na importação do que os diretórios de pacotes globais ou personalizados. Isso impedirá a criação, ativação ou desativação de ambientes virtuais.
É assim que a estrutura do pacote usando __pypackages__
se parecerá no Python 3.8:
foo __pypackages__ 3.8 lib bottle myscript.py
Neste artigo, mostrarei como usar o diretório local com pacotes sem esperar pela saída do Python 3.8.
Este artigo descreve um exemplo básico testado no Linux, Python 3.5. Para outras plataformas, pode ser necessário fazer alterações.
Instalando Pacotes em um Diretório Local
A instalação é quase a mesma que instalar pacotes usando o pip, com exceção da opção --target
. Nele, indicamos o caminho completo ou relativo ao diretório com pacotes locais.
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWD é uma variável com o diretório de trabalho atual.
A seguinte árvore de diretórios será criada:
foo __pypackages__ 3.5 lib bar myscript.py
A versão e os subdiretórios do Python devem ser especificados manualmente.
Também pode haver problemas se você precisar instalar pacotes com código binário e para diferentes arquiteturas. Eu não tinha esses pacotes, mas como solução, você pode adicionar mais arquitetura à estrutura de diretórios.
Outra opção de instalaçãoHá outra maneira de instalar pacotes em um diretório específico:
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
Mas você deve especificar o caminho completo para o local da instalação e a árvore de diretórios será diferente da proposta no PEP 582:
foo __pypackages__ lib python3.5 site-packages bar myscript.py
Usando o diretório local com pacotes
Após a instalação dos pacotes, resta informar ao intérprete onde procurar dependências.
Para fazer isso, adicione o caminho ao diretório local com pacotes na lista sys.path
. É suficiente adicionar o caminho ao módulo principal (primeiro carregado), não sendo necessário adicionar ao restante. Depois disso, você pode importar pacotes instalados localmente.
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
A única condição é que o módulo principal deve estar no mesmo nível de aninhamento que o diretório __pypackages__
.
Outra maneira de dizer ao Python onde procurar pacotes é definir uma variável de ambiente antes de executar o script.
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
De uma maneira tão simples, você pode obter funcionalidades semelhantes ao PEP 582 agora.