python package management confusion
dcs3spp
simonppears at googlemail.com
Sun Jan 20 16:08:25 EST 2019
On Sunday, 20 January 2019 20:38:30 UTC, Oscar Benjamin wrote:
> On Sun, 20 Jan 2019 at 16:22, dcs3spp via Python-list
> <python-list at python.org> wrote:
> >
> > On Saturday, 19 January 2019 11:17:19 UTC, dcs3spp wrote:
> > >
> > > My question is, can setuptools be configured to pull in child from a separate git repository when running python setup.py develop from parent folder? I have since found and tried this approach at https://stackoverflow.com/a/53706140/8325270
> > > It appears that later versions of setuptools can install via a PEP508 url. I currently trying to investigate this approach…..
> >
> > After trying PEP508 url approach my conclusions are as follows.
> >
> > A PEP508 url for a git repository can be used in *install_requires* of *setup.py*. An example is listed below.
> > ```
> > requires = [
> > 'parent',
> > 'kinto-http at git+https://github.com/Kinto/kinto-http.py',
> > ]
> > ...
> > install_requires=requires
> > ```
> > The package can then be installed with pip, using ```pip install -e . or pip install .```
> >
> > However, installation with setuptools is then broken, i.e. ```python setup.py develop``` and ```python setup.py install``` fails. setuptools looks for packages in pypi indexes. To install using setuptools a devpi index would have to be installed and configured or packages would have to installed from a paid for pypi repository in the cloud. Alternatively, developers could manually install each private package dependency individually, prior to running ```python setup.py develop``` for the source package. Unless, there are other alternative(s) such as zc.buildout with mr developer plugin etc.....
> >
> > If I want to have a Python private project, referencing other private project(s), available under source control and CI via gitlab.com, it seems that I can use the pip approach with PEP508 or use a requirements.txt file containing the git projects referenced as PEP508 urls, i.e. ```pip install -r requirements.txt```.
> >
> > Confusion, stems from the fact that pip and setuptools dependencies are then not synchronised, i.e. setuptools will break if PEP508 urls are listed for install_requires. Presumably the approach is to use either pip or setuptools but not both?
>
> I'm not sure what you mean by pip and setuptools not being
> synchronised. Pip depends on setuptools and cannot be used without it.
> Both setuptools and pip are maintained under the PyPA. They are
> intended to work together. in fact if your setup.py uses distutils
> instead of setuptools then pip will "inject" setuptools into it to
> ensure that meets pip's needs.
>
> You will need to be more specific about which commands you are using
> and what it is that becomes unsynchronised.
>
> --
> Oscar
Hi,
Have since done further testing and figured out how I can install from a setup.py file using both pip and python setup.py develop. Confusion was caused by trying to install using both pip and setuptools with PEP508 urls in install_requires, see note at end of post....
>From what I understand setuptools offers *dependency_links* as a list of dependency urls. In the example below, the *pyramid_core* package is a private dependency that I have written.
I am currently using pip 18.1. pip has an option *--process-dependencies* that issues a deprecation warning. The following *setup.py* example works with both setuptools (python setup develop etc.) and pip (pip install -e . and pip install .).
The example *setup.py* below can be installed using both setuptools and pip as follows:
```
python setup.py develop
python setup.py install
pip install -e . --process-dependency-links
pip install .
```
**setup.py that is compatible with both setuptools and pip 18.1**
=================================================================
```
import os
from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.md')) as f:
README = f.read()
with open(os.path.join(here, 'CHANGES.md')) as f:
CHANGES = f.read()
dependencies = [
'git+ssh://git@gitlab.com/dcs3spp/plantoeducate_core.git#egg=pyramid_core-0',
]
requires = [
'parent',
'pyramid_core',
]
setup_requires = [
]
tests_require = [
'pytest',
'pytest-cov',
]
setup(name='parent',
version='0.1',
description='parent',
long_description=README + '\n\n' + CHANGES,
classifiers=[
"Programming Language :: Python",
],
author='dcs3spp',
author_email='myemail at outlook.com',
url='',
keywords='setuptools',
packages=find_packages('src'),
package_dir={'': 'src'},
include_package_data=True,
zip_safe=False,
extras_require={
'testing': tests_require,
},
install_requires=requires,
dependency_links=dependencies,
setup_requires=setup_requires,
tests_require=tests_require,
)
```
Pip 18.1 supports reading pep508 direct urls from install_requires. In future release there are plans to deprecate the --process-dependency-links pip install option:
- https://github.com/pypa/pip/issues/4187
- https://github.com/pypa/pip/pull/4175
Will setuptools provide ability to use direct pep508 urls in install_requires in the future also?
More information about the Python-list
mailing list