Como posso fazer o setuptools instalar um pacote que não está no PyPI?

142

Comecei a trabalhar com setuptools e virtualenv. Meu pacote requer o último python-gearman disponível apenas no GitHub. A versão python-gearman que está no PyPI é antiga. A fonte do Github é compatível com setuptools, ou seja, possui setup.py, etc. Existe uma maneira de fazer com que o setuptools baixe e instale a nova versão em vez de procurá-la no PyPI e instalar a antiga?

Para sua informação, o novo python-gearman é http://github.com/mtai/python-gearman

andrei
fonte
1
Existe uma razão para você tentar instalar um pacote python diretamente do Git, em vez de baixar o código-fonte de lá e usá-lo python setup.py installno diretório de origem?
21810 Andrew Andrew
4
Quero que meu pacote seja implantado em várias máquinas e todas as suas dependências instaladas automaticamente.
22710 Andrei
2
Você pode usar easy_installou pipinstalá-lo diretamente do Github. Mas há também outra solução, você já pensou em adicionar o pacote ao PyPI?
Wolph 12/08/10
2
Como é simplesmente para implantação, por que não usar buildout? Ele tem alguns plugins Git prontos.
Wolph
solução aqui: stackoverflow.com/a/17442663/1841871
zazabe

Respostas:

156

A chave é informar ao easy_install onde o pacote pode ser baixado. Nesse caso específico, ele pode ser encontrado no URL http://github.com/mtai/python-gearman/tarball/master . No entanto, esse link por si só não funcionará, porque o easy_install não pode dizer apenas olhando para o URL o que ele obterá.

Alterando-o para http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta , o easy_install poderá identificar o nome do pacote e sua versão.

A etapa final é adicionar o URL aos dependency_links do seu pacote, por exemplo:

setup(
   ...
   dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

Agora, quando o seu pacote estiver sendo instalado, o easy_install descobrirá que existe um "gearman 2.0.0beta" disponível para download a partir desse URL e, felizmente, escolha-o sobre o PyPI, se você especificar "gearman> = 2.0.0beta" em suas dependências ..

(Normalmente, a maneira como isso é feito é incluir um link na página PyPI da pessoa para a fonte para download; nesse caso, se o autor do pacote gearman tiver incluído um link como o acima, você já estará definido Normalmente, as pessoas marcam a versão de desenvolvimento com 'myproject-dev' e usam o requisito 'myproject> = someever, == dev', de modo que, se não houver um pacote igual ou superior, o easy_install tentará confira ou faça o download do release.)

Você precisará especificar --process-dependency-linksao usar pip. Observe que o processamento dos links de dependência foi descontinuado e será removido em uma versão futura.

PJ Eby
fonte
1
Fiz o que você sugeriu, mas quando executo o "python setup.py develop", ele diz "escrevendo dependency_links em foo.egg-info / dependency_links.txt", mas na verdade não baixa e instala o pacote. Estou usando um virtualenv baseado em setuptools, se isso ajudar.
18710 Andrei
15
Você também precisa ter install_requires = 'gearman> = 2.0.0beta'; você incluiu isso?
PJ Eby
3
Ele não funciona para mim, com o betasufixo em uma versão existente no PyPI, ele ainda instalará o pacote do PyPI em vez do definido em dependency_links. Se você tentar definir uma versão superior à que existe no PyPI #egg=package-version, a ferramenta de configuração reclamará com um Could not find a version that satisfies the requirementerro e uma lista de todas as versões disponíveis no PyPI. Observe que estou tentando criar meu pacote sdiste instalá-lo pip install http://url/to/my/generated/tar.
Zazabe 28/10
1
ok, instalando meu pacote com easy_install http://url/to/my/generated/tar, tudo funciona como esperado ... Alguma idéia do porquê?
Zazabe 28/10
3
--process-dependency-linksfoi removido a partir de pip19! Veja: github.com/pypa/pip/issues/6162
phoenix
67

Você pode usar o pip install protocol+location[@tag][#egg=Dependency]formato para instalar diretamente da fonte usando o pip.

Git

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

Mercurial

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

Bzr

pip install bzr+http://bzr.myproject.org/MyProject/trunk

Os seguintes protocolos são suportados: [+git, +svn, +hg, +bzr]

Versões

@tag permite especificar uma versão / etiqueta específica para check-out.

#egg=name permite especificar o que o projeto é como uma dependência para outras pessoas.

A ordem deve sempre ser @tag#egg=name.

Repositórios particulares

Você também pode instalar a partir de repositórios privados alterando o protocolo para SSH ( ssh://) e adicionando um usuário apropriado ( git@):

git+ssh://git@github.com/username/my_private_repo

Você também pode instalar a partir de repositórios particulares com um nome de usuário / senha.

git+https://<username>:<password>@github.com/<user>/<repo>.git

O Github oferece a capacidade de criar tokens OAuth pessoais que podem ser alternados

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

requirements.txt

requirements.txt é usado para especificar dependências do projeto:

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

Estes não são instalados automaticamente com o pacote e deve ser instalado com o comando pip -r requirements.txt.

Incluindo arquivos de requisitos

Os arquivos de requisitos podem incluir outros arquivos de requisitos:

requirements-docs.txt

sphinx
-r requirements-dev.txt

requirements-dev.txt

some-dev-tool
-r requirements.txt

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

setup.py

Os arquivos de requisitos podem instalar as dependências especificadas setup.pycom o seguinte comando:

-e .

setup.pytambém pode instalar a partir de repositórios usando a mesma sintaxe acima, mas usando o dependency_linksvalor mencionado nesta resposta .

Referências:

https://pip.pypa.io/en/latest/user_guide.html#installing-packages https://pip.pypa.io/en/latest/reference/pip_install.html

Rebs
fonte
2
O setup.py PODE instalar a partir de repositórios. Basta pesquisar em 'setup.py dependency_links'
TomDotTom 29/04
1
@ TomDotTom Derp, eu até votei essa resposta, mas de alguma forma não a assimilei = P Vou atualizar minha resposta. Obrigado por apontar isso! Vai ajudar com algumas coisas que estou fazendo.
Rebs
Dependency_links Eu acho que está sendo depreciado (?) github.com/pypa/pip/issues/3939 . Eu amo esta resposta e acho que é melhor devido ao poder (em setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josias L.
21

Como eu só tinha que fazer a mesma coisa, eu encontrei outra maneira de fazer isso como pip's --process-dependency-linksestão programados para serem removidos em pip19,0 de acordo com este comentário .

pip 18.1 inclui o seguinte recurso

Permita que os requisitos de URL do PEP 508 sejam usados ​​como dependências.

A partir da descrição do PEP 508, a sintaxe para essas dependências de URL é semelhante a:

Uma pesquisa mínima baseada em URL:

pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

Então no seu setup.pypareceria

setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

Observe que o link é um arquivo morto e também pode ser uma liberação ou ramificação específica de um repositório, conforme descrito nesta resposta . Além disso, consulte essa resposta para trabalhar com outros hosts de repositório.

Que eu saiba, a maneira mais fácil de atualizar a dependência é usando pip install -I .ao instalar o pacote a partir do diretório

Phil
fonte
Isso também suporta tudo o que pip installsuporta, como URLs git, #subdirectory=...etc? Ou eles criaram uma nova sintaxe com recursos diferentes expostos de maneira diferente e incompatível?
remram
Se você não usa setuptools e gerencia dependências manualmente na linha de comando, parece que ainda precisa usar a abordagem descrita pela resposta do @Rebs .
Phil
1
Apenas para confirmar que isso funciona com distutils.core.setupepip 19.1.1
deveria
O resultante requirements.txt, no entanto, não é compatível compip install -r requirments.txt
deveria
@shouldsee a que requirments.txtvocê está se referindo?
Phil
6

O Vanilla setuptoolsnão suporta o download diretamente de um repositório git, mas você pode usar um dos links de Fonte de Download dessa página, como:

easy_install http://github.com/mtai/python-gearman/tarball/master
Ned Deily
fonte
Portanto, para garantir que esta versão do python-gearman esteja instalada em qualquer servidor em que meu pacote esteja, terei que executar o easy_install manualmente antes de instalar o meu pacote?
22710 Andrei
Se você usa o easy_install, sim. Mas, como outros já apontaram, você pode mudar para pipou buildoutque possuem gerenciamento de requisitos mais sofisticado. Veja, por exemplo: pip.openplans.org/#requirements-files
Ned Deily
Na verdade, você não precisa executar manualmente o easy_install; você pode simplesmente adicionar o link extra ao seu setup.py. Vou escrever uma resposta explicando os detalhes.
PJ Eby
2
Como mencionado no meu comentário acima setup.py fornece dependency_links que permite que você baixe a partir de um repositório gti
TomDotTom