sklearn/umap 的 ReadTheDocs 问题

ReadTheDocs trouble with sklearn/umap

我有一个我之前在 ReadTheDocs 上成功构建的包,但现在不再是这样了。我的导入如下:

import pandas as pd
import numpy as np
import scipy
import sys
from annoy import AnnoyIndex
from packaging import version
from scipy.spatial import cKDTree
from scipy.sparse import coo_matrix
from umap.umap_ import fuzzy_simplicial_set
from sklearn.neighbors import KDTree
from sklearn.neighbors import DistanceMetric
from sklearn.linear_model import Ridge

我通过在 Sphinx 中模拟导入来覆盖这些包。

autodoc_mock_imports = ['pandas','numpy','scipy','annoy','packaging','scipy.spatial','scipy.sparse','sklearn','sklearn.neighbors','sklearn.linear_model','umap','umap.umap_']

然而,尽管如此,我似乎在构建 ReadTheDocs 端时遇到了问题。似乎尽管被要求模拟 sklearn,但它正在尝试安装它但失败了。

Installed /home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/site-packages/bbknn-1.4.0-py3.7.egg
Processing dependencies for bbknn==1.4.0
Searching for scikit-learn
Reading https://pypi.org/simple/scikit-learn/
Downloading https://files.pythonhosted.org/packages/db/e2/9c0bde5f81394b627f623557690536b12017b84988a4a1f98ec826edab9e/scikit-learn-0.24.0.tar.gz#sha256=076369634ee72b5a5941440661e2f306ff4ac30903802dc52031c7e9199ac640
Best match: scikit-learn 0.24.0
Processing scikit-learn-0.24.0.tar.gz
Writing /tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/setup.cfg
Running scikit-learn-0.24.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/egg-dist-tmp-mfl2n2vi
Partial import of sklearn during the build process.
Traceback (most recent call last):
  File "/tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/setup.py", line 201, in check_package_status
    module = importlib.import_module(package)
  File "/home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'numpy'
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
    yield saved
  File "/home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
    yield
  File "/home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/site-packages/setuptools/sandbox.py", line 250, in run_setup
    _execfile(setup_script, ns)
  File "/home/docs/checkouts/readthedocs.org/user_builds/bbknn/envs/latest/lib/python3.7/site-packages/setuptools/sandbox.py", line 45, in _execfile
    exec(code, globals, locals)
  File "/tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/setup.py", line 306, in <module>
  File "/tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/setup.py", line 292, in setup_package
  File "/tmp/easy_install-1f85jnk0/scikit-learn-0.24.0/setup.py", line 227, in check_package_status
ImportError: numpy is not installed.
scikit-learn requires numpy >= 1.13.3.
Installation instructions are available on the scikit-learn website: http://scikit-learn.org/stable/install.html

为什么会这样?这可能与我在 setup.py 中要求依赖项的方式有关,它以某种方式绕过了模拟?

install_requires=['Cython','numpy','scipy','annoy','umap-learn','scikit-learn','packaging'],

我通过从 install_requires 中删除 umap-learnscikit-learn 来修复生成了一个文档字符串,但这不是一个理想的解决方案。有人有什么东西吗?

根据一位乐于助人的用户的反馈,我最终得出了一个不那么棘手的解决方案。不幸的是,由于一个无用的用户回复了 pip install -U numpy,讨论就擅离职守了,他等着我弄清楚,编辑了他们的答案并要求我接受它。被拒绝后,答案和评论线程消失了。我什至不记得你的名字,有用的用户,所以我不能把小费归功于你。

显然 ReadTheDocs 使用旧 pip,并且要求 pip>=19.0 使得 scikit-learn 无法从源安装。因此,我将该行添加到 docs/requirements.txt,我之前将其设置为 ReadTheDocs 需求文件。这带来了一些进展——现在不是 scikit-learn 抱怨 numpy,而是 numba。仍然,一些突触连接,我只是处理了通过docs/requirements.txt引起的任何依赖问题,其最终内容是:

pip>=19.0
numpy
llvmlite==0.35.0

这让设置清除。但是,仅仅因为设置已清除,并不意味着 autodoc_mock_imports 可以出于任何原因被剥离。不知道这是为什么。

因此,来自 OP 的快速而肮脏的解决方案可能是解决此问题的最简单方法,其中您只需从 setup.pyinstall_requires 中删除内容。但是,如果您想要让它变得更干净,并且不需要专门的非功能性提交来构建文档,那么拥有一个 ReadTheDocs 需求文件并通过它安装 numpy 可能会解决很多问题。不知道为什么 llvmlite 也这么挑剔,并且在需求文件中以某种方式工作,但在其他情况下却没有,但最终还是到了那里。