Python3需要以奇怪的方式失败

2024-10-01 19:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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行更改为:

__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上,不是红帽,但这可能无关紧要

谢谢


Tags: inimportversionlibpackagesdistsitepkg

热门问题