导入错误:找不到名为Cython.Distutils的模块。

62

在尝试安装Python库zenlib时,我遇到了一个奇怪的问题,使用它的setup.py文件。当我运行setup.py文件时,我收到一个导入错误,提示:

ImportError: No module named Cython.Distutils`

但我确实有这样一个模块,并且我可以在python命令行中轻松导入该模块。为什么会出现这种导入错误?

我认为问题可能与我使用的Enthought Python Distribution有关,我刚刚安装了这个软件包,而不是使用Ubuntu 12.04附带的Python 2.7。

更多背景信息: 以下是我尝试运行setup.py时精确获取到的内容:

enwe101@enwe101-PCL:~/zenlib/src$ sudo python setup.py install
Traceback (most recent call last):
  File "setup.py", line 4, in <module>
    from Cython.Distutils import build_ext
ImportError: No module named Cython.Distutils

但是在命令行中运行它是可行的:

>>> from Cython.Distutils import build_ext
>>> 
>>> from fake.package import noexist
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named fake.package

注意第一个导入操作成功了,而第二个抛出了错误。与setup.py的前几行进行比较:

#from distutils.core import setup
from setuptools import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os.path

我通过编辑~/.bashrc,在最后一行添加以下内容,将我的bash $PATH环境变量前置,以确保默认情况下运行的是Enthought Python Distribution而不是Ubuntu自带的Python:

export PATH=/usr/local/epd/bin:$PATH

实际上,which python 命令会输出 /usr/local/epd/bin/python... 由于不知道该怎么办,我进入了我的site packages目录 (/usr/local/epd/lib/python2.7/site-packages),并给 CythonDistutilsbuild_ext.py以及 __init__.py文件分别赋予了完全权限(r,w,x)。也许这样做有点儿蠢,但它没有改变任何东西。

下一步应该试什么呢?有什么想法吗?


我想不出什么,但你的 sys.path 里有什么? - Lev Levitsky
2
sudo python -c 'import Cython.Distutils' 可以正常工作吗? - jfs
我的实验得出了相同的结果,我在Ubuntu 12-04上安装了Python 2.7、Cython、NumPy和SciPy。出现了相同的错误跟踪(Traceback):最近的调用在“setup.py”文件的第4行,从Cython.Distutils导入build_ext。导入错误:没有名为Cython.Distutils的模块。似乎没有一个答案能够解决这个问题。亲爱的专家们,请帮帮忙! - pythOnometrist
5
对于通过 Google 找到这篇文章的人:sudo apt-get install python-dev; sudo pip install cython,它的意思是安装 Python 开发包并使用 pip 安装 Cython。 - Martin Thoma
12个回答

84

安装 Cython:

pip install cython

这对我有用,但不适用于最新版本的cython[0.22],而是适用于之前的版本0.21.2。 - dhilipsiva
事实上,对于那些在其依赖列表中没有明确包括 cython 或没有正确管理其依赖关系的软件包(在我的情况下是hmmlearn 0.1.1),这是解决方案。 - TheDudeAbides
2
我需要python-dev来获取python库头文件。 - f01

20
您的sudo没有使用正确的Python版本。这是Ubuntu中已知的sudo行为。请查看此问题获取更多信息。您需要确保sudo调用正确的Python,可以通过使用完整路径来实现:
sudo /usr/local/epd/bin/python setup.py install

或通过以下方法执行(在bash中):

alias sudo='sudo env PATH=$PATH'
sudo python setup.py install

我已经有一段时间没有发布这个问题了,但这确实是我解决问题的方法。最近的一篇帖子提醒我它仍然是开放的。使用@user91279的建议来找到适合您的正确路径。 - Edward Newell

11

使用Python3

sudo apt-get install cython3

对于Python2,请使用:

sudo apt-get install cython

更多详情可以阅读这里


谢谢! 我在Windows 10 WSL上使用Debian Buster,在这种特定情况下,这是解决方案。 - Batuhan

9

运行

which python

这是系统默认的 Python 路径,然后按照 @tiago 的方法进行操作:

sudo <which python 命令的输出> setup.py install


5

我给你的建议只有一个: 创建一个虚拟环境。这将确保你只有一个版本的Python以及所有安装的包都在本地而不是整个系统上。
这应该是解决方案之一。


1
以下命令在我的Ubuntu 14.04上解决了问题:
sudo apt-get install python-dev    
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libsystemd-daemon-dev
sudo pip install cython

这个链接帮了我一把:https://github.com/trezor/python-trezor/issues/40


1
在CLI-Python中,导入sys并查看sys.path中的内容
然后尝试使用export PYTHONPATH=whatyougot

1

阅读了许多这样的帖子,最终在Python 3上解决了问题。如果您安装了pip3,请使用pip3替换pip,并在运行任何这些命令之前运行pip uninstall cython,以防您尝试过其他解决方案。

Mac:

brew install cython
pip install --upgrade cython

Ubuntu
sudo apt-get install cython3 python-dev  
pip install --upgrade cython

Windows系统(必须已安装conda和MinGW,并将其添加到环境变量中)

conda install cython
conda install --upgrade cython

1

我在现代又遇到了这个问题。解决方案很简单:

pip uninstall cython && pip install cython

0

我在项目中依赖于Cython的第三方库,由于导入错误,在Travis上未能构建该项目。如果有人需要,可以在安装requirements.txt之前运行以下命令:

pip install Cython --install-option="--no-cython-compile"

还可能需要安装GCC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接