Edit: com base no comentário de Ulf Rompe, é importante que você use "1" em vez de "0" , caso contrário, você quebrará sys.path .
Eu tenho feito python por um bom tempo (mais de um ano), e sempre fico confuso sobre por que as pessoas recomendam que você use em sys.path.append()
vez de sys.path.insert()
. Deixe-me demonstrar.
Digamos que eu esteja trabalhando em um módulo chamado PyWorkbooks (que está instalado no meu computador), mas ao mesmo tempo estou trabalhando em um módulo diferente (digamos PyJob) que incorpora PyWorkbooks. Como estou trabalhando no PyJob, encontro erros nos PyWorkbooks que estou corrigindo, então gostaria de importar uma versão de desenvolvimento.
Existem várias maneiras de trabalhar em ambos (eu poderia colocar meu projeto PyWorkbooks dentro do PyJob, por exemplo), mas às vezes ainda terei de brincar com o caminho. No entanto, não posso simplesmente fazer um sys.path.append()
para a pasta onde está o PyWorkbooks . Por quê? Porque o python vai encontrar meus PyWorkbooks instalados primeiro!
É por isso que você deve fazer um sys.path.insert (1, path_to_dev_pyworkbooks)
Em suma:
sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one
ou:
sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file
Isso me causou alguns problemas no passado e eu realmente gostaria que nós (como uma comunidade) começássemos a recomendar sys.path.insert(1, path)
, como se você estivesse inserindo manualmente um caminho, acho que é seguro dizer que esse é o caminho que você deseja usar!
Ou eu tenho algo errado? É uma questão que às vezes me incomoda e eu queria que fosse abertamente!
fonte
sys.path.insert(1, dev_folder)
mas ainda não encontrei o módulo dev, e apenas usando o módulo instalado. Como faço para corrigir isso?Respostas:
Se você tiver várias versões de um pacote / módulo, precisará usar o virtualenv (ênfase minha):
É por isso que as pessoas consideram
insert(0,
errado - é uma solução provisória incompleta para o problema de gerenciamento de vários ambientes.fonte
virtualenv
e na verdade estou procurando a resposta associada ao OP)venv
.Se você realmente precisa usar sys.path.insert, considere deixar sys.path [0] como está:
Isso pode ser importante, pois o código de terceiros pode depender da conformidade da documentação sys.path :
fonte
você está confundindo o conceito de anexar e anexar. o código a seguir é antecedente:
ele coloca a nova informação no início (bem, em segundo lugar, para ser mais preciso) da sequência de busca que seu intérprete irá percorrer.
sys.path.append()
coloca as coisas no final da sequência de pesquisa.é aconselhável que você use algo parecido, em
virtualenv
vez de codificar manualmente os diretórios de seus pacotes noPYTHONPATH
everytime. para configurar vários ecossistemas que separam seus pacotes de site e possíveis versões de python, leia estes dois blogs:introdução aos ecossistemas python
inicialização de ambientes virtuais python
se você decidir seguir o caminho do isolamento do ambiente, certamente se beneficiará ao consultar o virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
fonte