为什么我的 virtualenv 找不到 distutils.sysconfig?

why can't my virtualenv find distutils.sysconfig?

我刚刚创建了一个 Python 项目,该项目是通过测试驱动开发构建的。我当然看到了它的价值,我期待着进一步利用它。

我已经使用 pyenv 安装了所有必需的 Python 解释器(参见 tox.ini)。 运行 tox -r,我最终遇到了 2.6 的以下问题(我还有其他问题,但我可以解决):

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 20, in <module>
    import distutils.sysconfig
ImportError: No module named distutils.sysconfig

ERROR: InvocationError: /home/wxl/.pyenv/shims/python2.6 /usr/lib/python2.7/dist-packages/virtualenv.py --setuptools --python /home/wxl/.pyenv/shims/python2.6 py26 (see /home/wxl/dev/git/blogofobe/.tox/py26/log/py26-0.log)

很明显,代码没有问题,而是试图调用 virtualenv。回溯似乎表明它与丢失的模块有关,但那些应该在标准库中,即使在 2.6 中也是如此。

有趣的是,如果我 运行 python2.6 并尝试 import distutils.sysconfig 它会失败。另一方面,如果我用 pyenv shell 2.6.9 切换到那个版本并尝试同样的事情,它工作正常。

我错过了什么?

FWIW,我在 Ubuntu 14.04 并且:

$ python --version
Python 2.7.6

$ python2.7 --version
Python 2.7.6

$ python2.6 --version
Python 2.6.9

看来您正在使用 Debian 提供的 virtualenv 和来自 pyenv 的 python。这无法正常工作,因为 Debian 已经修补了 site.py、distutils、sysconfig,可能还有你试图用来对已安装 python 的文件布局做出某些假设的 virtualenv。 dist-packages 是 Debian 特定 python 补丁的明确指标。

这些假设不符合 pyenv 安装的标准 python。解决方法是在pyenv里面安装virtualenvpython,eg:

/home/wxl/.pyenv/shims/pip-2.6 install virtualenv

如果你没有 pip shim,那么使用这个:

/home/wxl/.pyenv/shims/easy_install-2.6 pip virtualenv

不要忘记通过 运行 pyenv rehash

重新生成垫片