Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can Pip install dependencies not specified in setup.py at install time?

Tags:

I'd like pip to install a dependency that I have on GitHub when the user issues the command to install the original software, also from source on GitHub. Neither of these packages are on PyPi (and never will be).

The user issues the command:

pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly 

This repo has a requirements.txt file, with another dependency on GitHub:

-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler 

What I'd like is a single command that a user can issue to install the original package, have pip find the requirements file, then install the dependency too.

like image 477
cflewis Avatar asked Nov 11 '10 00:11

cflewis


People also ask

Does pip install dependencies automatically?

Pip relies on package authors to stipulate the dependencies for their code in order to successfully download and install the package plus all required dependencies from the Python Package Index (PyPI). But if packages are installed one at a time, it may lead to dependency conflicts.

Does pip install run setup py?

pip is a package manager, which can install, upgrade, list and uninstall packages, like familiar package managers including: dpkg, apt, yum, urpmi, ports etc. Under the hood, it will run python setup.py install , but with specific options to control how and where things end up installed.

What is the difference between pip install and Python pip install?

They do exactly the same thing. In fact, the docs for distributing Python modules were just updated to suggest using python -m pip instead of the pip executable, because it's easier to tell which version of python is going to be used to actually run pip that way.


2 Answers

This answer helped me solve the same problem you're talking about.

There doesn't seem to be an easy way for setup.py to use the requirements file directly to define its dependencies, but the same information can be put into the setup.py itself.

I have this requirements.txt:

PIL -e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor 

But when installing that requirements.txt's containing package, the requirements are ignored by pip.

This setup.py seems to coerce pip into installing the dependencies (including my github version of 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',     ] ) 

Edit:

This answer also contains some useful information.

Specifying the version as part of the "#egg=..." is required to identify which version of the package is available at the link. Note, however, that if you always want to depend on your latest version, you can set the version to dev in install_requires, dependency_links and the other package's setup.py

Edit: using dev as the version isn't a good idea, as per comments below.

like image 70
Gabriel Grant Avatar answered Sep 21 '22 13:09

Gabriel Grant


Here's a small script I used to generate install_requires and dependency_links from a requirements file.

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) 
like image 40
Simon Charette Avatar answered Sep 17 '22 13:09

Simon Charette