Python3 __requires__ не работает странным образом

Догма Python заключается в том, что virtualenv должен использоваться для разделения разных версий одних и тех же пакетов. В большинстве других контекстов программирования это не проблема. Например, в linux всевозможные версии динамических библиотек могут быть размещены в /usr/lib64, и у загрузчика нет проблем с выбором правильной версии для двоичного файла.

Python предоставляет механизм для выбора только желаемых версий. Поэтому я пытался хранить несколько версий пакетов Python в одном месте. Это означает, что пакеты должны быть упакованы следующим образом, чтобы загрузить нужные версии:

python3
__requires__ = ['scipy <1.3.0,>=1.2.0', 'anndata <0.6.20', 'loompy <3.0.0,>=2.00', 'h5py <2.10', ]
import pkg_resources
import scipy
print(scipy.__version__)
import anndata
print(anndata.__version__)
import loompy
print(loompy.__version__)
import h5py
print(h5py.__version__)
import scanpy
print(scanpy.__version__)
quit()

#emits

 python3
Python 3.6.8 (default, Nov 21 2019, 19:31:34) 
[GCC 8.3.1 20190507 (Red Hat 8.3.1-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> __requires__ = ['scipy <1.3.0,>=1.2.0', 'anndata <0.6.20', 'loompy <3.0.0,>=2.00', 'h5py <2.10']
>>> import pkg_resources
>>> import scipy
>>> print(scipy.__version__)
1.2.3
>>> import anndata
/home/common/lib/python3.6/site-packages/anndata-0.6.19-py3.6.egg/anndata/base.py:17: FutureWarning: pandas.core.index is deprecated and will be removed in a future version.  The public classes are available in the top-level namespace.
  from pandas.core.index import RangeIndex
>>> print(anndata.__version__)
0.6.19
>>> import loompy
>>> print(loompy.__version__)
2.0.17
>>> import h5py
>>> print(h5py.__version__)
2.9.0
>>> import scanpy
>>> print(scanpy.__version__)
1.4.3

Все идет нормально. Однако, если требуется изменить строку на:

__requires__ = ['scipy <1.3.0,>=1.2.0', 'anndata <0.6.20', 'loompy <3.0.0,>=2.00', 'h5py <2.10', 'scanpy <1.4.4,>=1.4.2']

тогда все полностью разваливается. Вместо этого запускается:

python3
Python 3.6.8 (default, Nov 21 2019, 19:31:34) 
[GCC 8.3.1 20190507 (Red Hat 8.3.1-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> __requires__ = ['scipy <1.3.0,>=1.2.0', 'anndata <0.6.20', 'loompy <3.0.0,>=2.00', 'h5py <2.10', 'scanpy <1.4.4,>=1.4.2']
>>> import pkg_resources
Traceback (most recent call last):
  File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 584, in _build_master
    ws.require(__requires__)
  File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 901, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 792, in resolve
    raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.VersionConflict: (scanpy 1.5.1 (/home/common/lib/python3.6/site-packages), Requirement.parse('scanpy<1.4.4,>=1.4.2'))

During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3261, in <module>
        @_call_aside
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3245, in _call_aside
        f(*args, **kwargs)
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3274, in _initialize_master_working_set
        working_set = WorkingSet._build_master()
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 586, in _build_master
        return cls._build_from_requirements(__requires__)
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 599, in _build_from_requirements
        dists = ws.resolve(reqs, Environment())
      File "/usr/common/lib/python3.6/site-packages/pkg_resources/__init__.py", line 792, in resolve
        raise VersionConflict(dist, req).with_context(dependent_req)
    pkg_resources.ContextualVersionConflict: (scipy 1.2.3 (/home/common/lib/python3.6/site-packages/scipy-1.2.3-py3.6-linux-x86_64.egg), Requirement.parse('scipy>=1.3.1'), {'umap-learn'})
    >>> import scipy
    >>> print(scipy.__version__)
    1.4.1
    # and numerous other issues

Это очень странно, потому что, когда для scanpy не было установлено никаких ограничений, нужная версия загружалась, но когда она была установлена, она подавлялась на 1.5.1.

Почему лишнее ограничение все ломает???

Существующие версии этих пакетов:

anndata
anndata-0.6.19.dist-info
anndata-0.6.19-py3.6.egg
anndata-0.7.1.dist-info
anndata-0.7.3.dist-info
scipy
scipy-1.2.3.dist-info
scipy-1.2.3-py3.6-linux-x86_64.egg
scipy-1.4.1.dist-info
loompy
loompy-2.0.17.dist-info
loompy-2.0.17-py3.6.egg
loompy-3.0.6.dist-info
h5py
h5py-2.10.0.dist-info
h5py-2.9.0.dist-info
h5py-2.9.0-py3.6-linux-x86_64.egg
scanpy
scanpy-1.4.3.dist-info
scanpy-1.4.3-py3.6.egg
scanpy-1.4.6.dist-info
scanpy-1.5.1.dist-info
scanpy-1.5.2.dev7+ge33a2f33-py3.6.egg

На самом деле это на CentOS, а не на Red Hat, но, вероятно, это не имеет значения.

Спасибо.

0 ответов

Другие вопросы по тегам