【问题标题】:Compiling scikit-image on Windows to run tests在 Windows 上编译 scikit-image 以运行测试
【发布时间】:2019-04-13 06:00:15
【问题描述】:

我被难住了。我正在开发一些enhancements to scikit-image,它们是failing the automated build tests,可能是由于舍入错误。因此,我需要在我的 Windows 系统上运行自动化测试,以便调试并找出问题所在。到目前为止,我已经尝试了两种方法,但都不起作用:

  1. 在我的 Anaconda Python 3.6 环境中,当我尝试运行自动化测试时,出现以下错误:

    RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

    ...我在其他情况下找到了参考,但无法消除。

  2. 由于自动化测试确实在基于 Python 3.5 的系统上运行(但失败),我认为如果我尝试使用本地 Python 3.5 环境,事情可能会奏效。在这里,我遇到了一个问题,尽管已安装,但环境找不到 MS C++ 编译器cl.exe。它安装在C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\ 中,由我的 Python 3.6 环境找到并执行,但是尽管我将该目录添加到我的 PATH 中,但我的 Python 3.5 环境却找不到它。我应该补充一点,我的 Python 3.6 环境发现它没有添加到 PATH 的目录。我了解 Python 3.5 和 3.6 都使用 MSVC 14.0。

如果可能的话,我更愿意在我的 Python 3.6 环境中解决这个问题。非常感谢任何帮助。

更新

我已经制作了一个全新的 Python 3.6 conda 环境,如下所示:

conda create --name sk36 python=3.6
conda activate sk36
conda install scikit-image --only-deps
conda install cython
git clone https://github.com/scikit-image/scikit-image.git
cd scikit-image
pip install -e .
pytest skimage/feature

我得到的具体错误如下:

..\Anaconda3\lib\site-packages\py\_path\local.py:662: in pyimport
    __import__(modname)
skimage\__init__.py:135: in <module>
    from .data import data_dir
skimage\data\__init__.py:13: in <module>
    from ..io import imread, use_plugin
skimage\io\__init__.py:7: in <module>
    from .manage_plugins import *
skimage\io\manage_plugins.py:24: in <module>
    from .collection import imread_collection_wrapper
skimage\io\collection.py:12: in <module>
    from ..external.tifffile import TiffFile
skimage\external\tifffile\__init__.py:1: in <module>
    from .tifffile import imsave, imread, imshow, TiffFile, TiffWriter, TiffSequence
skimage\external\tifffile\tifffile.py:292: in <module>
    from . import _tifffile
E   RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

...这似乎与tifffile 有关。由于这个包最初并没有显式安装在我的新环境中,我尝试安装它的各种版本,包括一些降级的numpyscipy。还是和上面一样的错误。

做了更多research 之后,实际上安装了 1.15.4 版本时,似乎看到了 numpy 1.13.x。这是conda list 的完整输出:

# Name                    Version                   Build  Channel
blas                      1.0                         mkl    anaconda
ca-certificates           2018.03.07                    0    anaconda
certifi                   2018.10.15               py36_0    anaconda
cloudpickle               0.6.1                    py36_0    anaconda
cycler                    0.10.0           py36h009560c_0    anaconda
cython                    0.29             py36ha925a31_0    anaconda
dask-core                 0.20.0                   py36_0    anaconda
decorator                 4.3.0                    py36_0    anaconda
freetype                  2.9.1                ha9979f8_1    anaconda
icc_rt                    2017.0.4             h97af966_0    anaconda
icu                       58.2                 ha66f8fd_1    anaconda
imageio                   2.4.1                    py36_0    anaconda
intel-openmp              2019.0                      118    anaconda
jpeg                      9b                   hb83a4c4_2    anaconda
kiwisolver                1.0.1            py36h6538335_0    anaconda
libpng                    1.6.35               h2a8f88b_0    anaconda
libtiff                   4.0.9                h36446d0_2    anaconda
matplotlib                3.0.1            py36hc8f65d3_0    anaconda
mkl                       2019.0                      118    anaconda
mkl_fft                   1.0.6            py36hdbbee80_0    anaconda
mkl_random                1.0.1            py36h77b88f5_1    anaconda
networkx                  2.2                      py36_1    anaconda
numpy                     1.15.4           py36ha559c80_0    anaconda
numpy-base                1.15.4           py36h8128ebf_0    anaconda
olefile                   0.46                     py36_0    anaconda
openssl                   1.0.2p               hfa6e2cd_0    anaconda
package_has_been_revoked  1.0                           0    enable_revoked
pillow                    5.3.0            py36hdc69c19_0    anaconda
pip                       18.1                     py36_0    anaconda
pyparsing                 2.3.0                    py36_0    anaconda
pyqt                      5.9.2            py36h6538335_2    anaconda
python                    3.6.7                h33f27b4_1    anaconda
python-dateutil           2.7.5                    py36_0    anaconda
pytz                      2018.7                   py36_0    anaconda
pywavelets                1.0.1            py36h8c2d366_0    anaconda
qt                        5.9.6            vc14h1e9a669_2    anaconda
scikit-image              0.15.dev0                 <pip>
scipy                     1.1.0            py36h4f6bf74_1    anaconda
setuptools                40.5.0                   py36_0    anaconda
sip                       4.19.8           py36h6538335_0    anaconda
six                       1.11.0                   py36_1    anaconda
sqlite                    3.25.2               hfa6e2cd_0    anaconda
tifffile                  0.15.1          py36h452e1ab_1001    conda-forge
tk                        8.6.8                hfa6e2cd_0    anaconda
toolz                     0.9.0                    py36_0    anaconda
tornado                   5.1.1            py36hfa6e2cd_0    anaconda
vc                        14.1                 h21ff451_3    anaconda
vs2015_runtime            15.5.2                        3    anaconda
wheel                     0.32.2                   py36_0    anaconda
wincertstore              0.2              py36h7fe50ca_0    anaconda
zlib                      1.2.11               h8395fce_2    anaconda

更新 2

我已经解决了 Python 3.6 的问题,并且我认为上面有足够的信息让精明的人能够找出问题所在。我将把解决方案放在下面的答案中。

一个干净构建的 Python 3.5 环境找不到编译器,所以这个问题仍然存在。

【问题讨论】:

  • 我个人从未成功地在 Windows 上从源代码编译 numpy 或 scipy。我总是使用 anaconda 发行版的预编译安装程序。
  • @Aaron - 我没有尝试编译这些包中的任何一个。
  • 它们都是 scipy.org 生态系统的一部分,所以它们非常相关。我没有亲自尝试编译scikit-image,但我确信大部分代码库都是相似的......
  • 此外,错误本身听起来实际上是 numpy 需要针对较新的基础重新编译...
  • 谢谢。引用了哪个 API?

标签: python python-3.x scikit-learn


【解决方案1】:

您可以尝试的一种方法是升级您的 numpy

pip install numpy --upgrade

如此处所述:RuntimeError: module compiled against API version a but this version of numpy is 9

否则(如果由于某种原因您无法升级 numpy)我建议为 scikit-image 项目使用虚拟环境。我刚刚在 Windows 10 上尝试过,并且能够成功执行测试。我的步骤(来自 cmd,在项目文件夹中):

  • conda uninstall scikit-image 删除任何以前构建/安装的版本
  • conda -n scikit-image python=3.6为这个项目创建一个虚拟环境(我用的是python 3.6,不过你可以改成3.5)
  • activate scikit-image 激活了新的虚拟环境
  • pip install -r requirements.txt -- 安装的依赖项(没有这一步我没有安装测试的依赖项)
  • pip install -e .
  • pytest

【讨论】:

  • 感谢您的意见。我尝试了一些非常相似的方法,使用 box fresh 3.5 和 3.6 conda 环境。 3.5的环境找不到编译器,3.6的运行pytest的时候报numpy API错误。
【解决方案2】:

事实证明 pytest 实际上并没有安装在正确的环境中,它是从确实安装了 numpy 1.13.3 的 base 调用的。在干净构建的 Python 3.6 环境中安装它至少解决了 Python 3.6 的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2018-12-07
    • 2020-03-12
    • 2020-02-19
    相关资源
    最近更新 更多