Como um pacote Debian pode instalar módulos Python a partir do PyPI

20

Esta pergunta tenta complementar esta . Eu tenho um aplicativo python que usa módulos de terceiros do PyPI. Quero empacotar meu aplicativo em um pacote debian, mas não sei como lidar com dependências python que não estão nos repositórios debian / ubuntu (empacotadas como pacotes debian também)

Solução # 1:
construa os módulos do PyPI diretamente no meu pacote debian.

Solução 2:
crie pacotes debian para todos os módulos PyPI que eu preciso usar stdeb e adicione-os aos repositórios debian / ubuntu.

Na verdade, preciso de uma solução nº 3 porque quero instalar dependências do PyPI ao instalar meu pacote debian, de preferência em um virtualenv!

Qual seria a solução nº 3 ? Preciso ajustar o script DEBIAN / preinst mantenedor?

andri_ch
fonte
Você pode descrever por que você precisa criar um pacote Debian? Seu aplicativo Python precisa de recursos não-Python?
Jonathan
@ Jonathan Quero que os usuários possam instalar meu aplicativo no Ubuntu Software Center. Eu acho que preciso de um * .deb para isso. Meu aplicativo Python não precisa de recursos não-Python, apenas módulos python de terceiros.
andri_ch
Os pacotes @Jonathan Debian são o método de instalação padrão no Ubuntu. Pode-se distribuir facilmente um .debarquivo, configurar um repositório privado ou um PPA no Launchpad.
MestreLion 6/08/14

Respostas:

20

Conversei com alguns mantenedores no canal IRC do Debian, irc: //irc.debian.org#debian-mentors , pedindo exatamente a mesma coisa, e o consenso geral foi:

Solução 1:

A integração de dependências no seu pacote, copiando seus arquivos de origem como uma única base de código, é muito desaprovada. Isso anularia a finalidade de um sistema de empacotamento que lida com dependências, atualizações, controle de versão, etc.

Solução # 3:

Baixar pacotes não-debian on-the-fly ao instalar um binary ( .deb) é um sério risco de segurança, definitivamente um não-não. Você nem conseguiria inspecionar as dependências extraindo as deb, porque elas são baixadas e instaladas no momento da instalação. É uma abordagem que ignora completamente o sistema de repositórios. Nenhum usuário preocupado ficaria satisfeito com um pacote que, nos bastidores (e rootlembre-se!), Baixa software não confiável adicional de fontes não confiáveis. Sim, isso exigiria mexer com DEBIAN/postinst(ou preinst) e emitir um wget(ou, no seu caso,pip install) e essa é a abordagem adotada pelo Flash, Oracle Java, Steam e outros. Mas esse é um software proprietário e de código fechado; portanto, a segurança deles não é nenhuma.

Solução 1.5:

Você não mencionou isso, mas você poderia integrar as dependências somente em tempo de compilação , ou seja, na fonte do pacote (o .orig.tar.gz, .debian.tar.gz, .dsctríade), por meio de download PyPI ao criar o pacote "binário" (a .deb). As instruções para o pip installentrariam debian/rules(observe as letras minúsculas debian, ao contrário do pacote binário) e seriam executadas quando você emitir debuildou dpkg-buildpackage.

Este é um meio termo entre os nºs 1 e 3. Atenua (mas não resolve!) Alguns dos problemas do n ° 3: pelo menos você pode inspecionar o produto final e .debnão exigiria acesso à Internet no momento da instalação. Todos os riscos e encargos são transferidos do usuário final para o mantenedor do pacote. Mas, tem os mesmos problemas que o nº 1, pois ignora a maior parte da infraestrutura do sistema de empacotamento. Afinal, lidar com dependências (versões, atualizações, requisitos, conflitos) é por que dpkg/ aptfoi criado em primeiro lugar! :)

Solução 2:

O único caminho certo ™ . Você cria pacotes debian para suas dependências, os lista como requisitos em seu pacote e envia todos os .debspacotes ou de origem.

A partir daí, você tem várias opções:

  • Envie os pacotes fonte, tanto seu software quanto suas dependências, para inclusão no Debian. Se aceito, eles estarão automaticamente disponíveis para todos os usuários do Debian, incluindo todos os derivados como o Ubuntu.

  • Carregue os pacotes de origem no Launchpad , criando assim um PPA que qualquer usuário do Ubuntu (e seus derivados como o Linux Mint) poderia facilmente adicionar e instalar

  • Hospede seu próprio repositório debian em seu site, para que usuários de qualquer sistema baseado em Debian possam adicionar /etc/apt/sources.list.de usar a aptinfraestrutura para baixar, instalar e manter atualizados (como o acima!)

  • Hospede os .debarquivos para download direto e instalação. Nenhuma aptatualização automática ou envolveu o pensamento.

Quanto a como empacotar suas dependências PyPi (e seu software python também!), Existem várias ferramentas e referências que facilitam o processo:

  • stdeb , como você mencionou. Oldie e goodie.

  • Pybuild , uma ferramenta nova e incrível do Debian que substitui stdeb.

E muitas referências úteis:

Preciso de ajuda? Confira aqueles:

MestreLion
fonte
2

Eu acho que você só precisa adicionar o código de linha de comando relevante ao script postinst no pacote .deb. Encontrado nesta resposta , mais detalhes no guia oficial do debian .

TheSchwa
fonte
2

Existe pypi2debpara obter um pacote do pypi e transformá-lo em um pacote deb.

LtWorf
fonte
0

Eles não, é como o cpan no perl; se você possui repositórios, pode instalar com o apt-get; caso contrário, com o pip, a diferença deve ser a instalação do pip em / usr / local.

Para instalar com o pip, você pode:

apt-get install python-pip 
pip install foopackage 

por exemplo:

pip install MultipartPostHandler2
Sérgio
fonte
Isso não responde à pergunta do OP. A questão é como fazer com que um pacote Debian instale um pacote Python a partir do PyPi para que um 'apt-get <custom-package>' ou 'dpkg -i <custom-package>' extraia dependências do PyPi do PyPi.
precisa saber é o seguinte
Eles não, é como o cpan no perl, se você possui repositórios, pode instalar com o apt-get; caso contrário, com o pip, a diferença deve ser a instalação do pip em / usr / local, mas talvez seja melhor excluir minha resposta.
Sérgio
Seu comentário fornece uma resposta apropriada à pergunta do OP. Você deve colocar esse comentário na sua resposta para ser votado. (Por exemplo, consulte a resposta do MestreLion.) Como está, sua resposta não responde à pergunta do OP.
SevakPrime