Como posso fazer um módulo de extensão de Python empacotado como um carregável ovo sem instalá-lo?

StackOverflow https://stackoverflow.com/questions/737383

Pergunta

Eu estou no meio de refazer nossos scripts de construção basear-se a ferramenta Waf maravilhosa (eu fiz uso SCons para as idades, mas apenas a sua maneira muito lento).

De qualquer forma, eu bati a seguinte situação e eu não consigo encontrar uma solução para isso:

  • Eu tenho um produto que depende de um número de arquivos de ovos construídas anteriormente.
  • Eu estou tentando embalar o produto usando PyInstaller como parte do processo de construção.
  • eu construir as dependências primeiro.
  • Em seguida eu quero correr PyInstaller para empacotar o produto que depende dos ovos que eu construí. Eu preciso PyInstaller para ser capaz de carregar esses arquivos de ovo como parte de seu processo de embalagem.

Isso parece fácil: você trabalha para fora o que PYTHONPATH deve ser, construir uma cópia de sys.environ definindo a variável corretamente, e, em seguida, chamar o script PyInstaller usando subprocess.Popen passando o ambiente configurado anteriormente como o argumento env

.

O problema é que PYTHONPATH ajuste por si só não parece ser suficiente se os ovos que você está adicionando são módulos de extensão que são empacotados como zipsafe. Neste caso, verifica-se que as bibliotecas embutidas não são capazes de ser importado.

Se eu descompactar os ovos (renomear os diretórios para .egg), eu posso importá-los sem mais configurações, mas isso não é o que eu quero neste caso.

Eu também pode obter os ovos para importação a partir de um subnível, fazendo o seguinte:

  • Definir PYTHONPATH para o diretório que contém o ovo que você deseja importar (não o caminho do próprio ovo)
  • Carregando um shell python e usando pkg_resources.require para localizar o ovo.

Uma vez que isso tenha sido feito, as cargas de ovos como normal. Novamente, isto não é prático porque eu preciso ser capaz de executar o meu shell python de uma forma em que ele está pronto para importar estes ovos desde o início.

A opção sujo seria a saída de um script que levou as ações acima antes de chamar o script de destino real, mas esta parece ser a coisa errada a fazer:. Deve haver uma maneira melhor de fazer isso

Foi útil?

Solução

Heh, eu acho que esta foi a minha ruim. A questão parece ter sido que a bandeira zipsafe em setup.py para o pacote de extensão foi definida para Falso, o que parece afetar sua capacidade de tratá-lo como tal em tudo.

Agora que eu definir que como True posso importar os arquivos de ovo, simplesmente adicionando cada um para o PYTHONPATH.

Espero que alguém encontre outro lugar esta resposta útil um dia!

Outras dicas

Embora você tenha uma solução, você pode sempre tentar "virtualenv" que cria um ambiente virtual de python, onde pode instalar e testar os pacotes Python sem mexer com o python núcleo do sistema:

http://pypi.python.org/pypi/virtualenv

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