在Linux中安装matplotlib的问题

1 投票
1 回答
3039 浏览
提问于 2025-04-18 06:24

我已经成功安装了numpy,现在想安装matplotlib。我正在按照以下网站上的步骤进行操作:

http://matplotlib.org/faq/installing_faq.html#source-install-from-git

在执行以下命令后出现了错误:

python setup.py install

这是错误信息:

Checking .pth file support in /usr/local/lib/python2.7/dist-packages/
error: can't create or remove files in install directory                                     '

The following error occurred while trying to add or remove files in the installation directory:

    [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/test-easy-install-24752.pth'

The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was:

    /usr/local/lib/python2.7/dist-packages/

我在我的电脑上以管理员身份工作,并且(我认为)我有所有读取/写入文件的权限:

administrator@ubuntu:/usr/local/lib/python2.7/dist-packages$ ll -a
total 8
drwxrwsr-x 2 root staff 4096 Aug 20  2013 ./
drwxrwsr-x 4 root staff 4096 Mar  9 11:04 ../

这个问题是什么,我该怎么解决呢?

1 个回答

3

我在我的电脑上担任管理员(我想)拥有读取和写入文件的所有权限。

这个问题其实更适合在 SuperUser 上讨论,但问题在于,成为“管理员”并不一定意味着你想的那样。在这行代码中:

drwxrwsr-x 2 root staff 4096 Aug 20  2013 ./

root 是这个目录的拥有者,而最后的 r-x 表示其他用户只能读取和执行这个目录里的内容,而不能写入(想了解更多可以查看 这里)。

你可以做些什么?

  1. root 身份运行安装命令,比如 $ sudo python setup.py install。这不推荐! 通过这种方式安装系统范围的 Python 模块的问题在于,其他的包管理工具(比如 apt-get)对这种方式的更改完全不知情,这通常会导致其他系统包的依赖关系出现混乱。

  2. 从 Ubuntu 的软件库安装包,也就是 $ sudo apt-get install python-matplotlib。这可能是安装 matplotlib 最简单的方法,而且不太可能破坏任何依赖关系。不过,Ubuntu 的软件库里大多数 Python 包的版本相对较旧。

  3. 把它安装到 virtualenv 中。这是安全的,因为它不会影响你全局的 site-packages,而且允许你安装最新的版本。不过,把 matplotlib 安装到 virtualenv 中可能会有点麻烦,因为 matplotlib 有很多后端依赖,通常需要在系统范围内安装。为了解决这个问题,你可以选择:

    a) 创建你的 virtualenv 时加上 --system-site-packages 选项。使用这个选项,如果 Python 尝试 import 一个在你 virtualenvsite-packages 目录中没有安装的模块,它会去系统范围的 site-packages 中查找。这意味着你可以在 virtualenv 中本地安装 matplotlib,并且它会在系统范围的 site-packages 中找到所有的后端依赖。缺点是,如果你在本地和系统范围内都有同一个模块,你需要更小心地确认实际导入的是哪个版本。

    b) 创建你的 virtualenv 时加上 --no-site-packages 选项,然后在系统范围的 site-packages 目录中创建所需模块的符号链接。这篇博客文章提供了在 virtualenv 中使用符号链接安装 matplotlib 的详细步骤。这个方法更复杂,但好处是你的 virtualenv 几乎是完全自包含的,模块的 import 来源也没有疑问。

撰写回答