Può Pip installare le dipendenze non specificati nel setup.py al momento dell'installazione?
-
08-10-2019 - |
Domanda
Mi piacerebbe pip di installare una dipendenza che ho su GitHub quando l'utente invia il comando per installare il software originale, anche da fonte su GitHub. Nessuno di questi pacchetti sono in Cheese Shop (e mai lo sarà).
I problemi degli utenti il ??comando:
pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly
Questa repo ha un file requirements.txt
, con un altro dipendenza da GitHub:
-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler
Quello che mi piacerebbe è un singolo comando che un utente può rilasciare per installare il pacchetto originale, hanno pip trovare il file requisiti, quindi installare la dipendenza troppo.
Soluzione
Questo rispondere a mi ha aiutato a risolvere lo stesso problema si sta parlando.
Ci non sembra essere un modo semplice per setup.py di utilizzare i requisiti di file direttamente per definire le sue dipendenze, ma la stessa informazione può essere messo in setup.py stesso.
ho questo requirements.txt:
PIL
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor
Ma quando si installa il pacchetto contenente quel requirements.txt, i requisiti sono ignorati dai pip.
Questa setup.py sembra costringere PIP a installare le dipendenze (tra cui la mia versione github di django-ckeditor):
from setuptools import setup
setup(
name='django-articles',
...,
install_requires=[
'PIL',
'django-ckeditor>=0.9.3',
],
dependency_links = [
'http://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3',
]
)
Modifica
Questo rispondere contiene anche alcune informazioni utili.
Come specificare la versione come parte del "#egg = ..." è necessaria per identificare la versione del pacchetto è disponibile al link. Si noti, tuttavia, che se si vuole sempre dipenderà dalla vostra ultima versione, è possibile impostare la versione a dev
in install_requires, dependency_links e l'altro pacchetto di setup.py
Modifica:. utilizzando dev
come la versione non è una buona idea, come da commenti qui sotto
Altri suggerimenti
Ecco un piccolo script che ho usato per generare install_requires
e dependency_links
da un file di requisiti.
import os
import re
def which(program):
"""
Detect whether or not a program is installed.
Thanks to http://stackoverflow.com/a/377028/70191
"""
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
fpath, _ = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ['PATH'].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$')
install_requires = []
dependency_links = []
for requirement in (l.strip() for l in open('requirements')):
match = EDITABLE_REQUIREMENT.match(requirement)
if match:
assert which(match.group('vcs')) is not None, \
"VCS '%(vcs)s' must be installed in order to install %(link)s" % match.groupdict()
install_requires.append("%(package)s==%(version)s" % match.groupdict())
dependency_links.append(match.group('link'))
else:
install_requires.append(requirement)
fa la tua domanda questa risposta?
setup(name='application-xpto',
version='1.0',
author='me,me,me',
author_email='xpto@mail.com',
packages=find_packages(),
include_package_data=True,
description='web app',
install_requires=open('app/requirements.txt').readlines(),
)