为啥 `virtualenv` 找不到 `pkg_resources`?

Posted

技术标签:

【中文标题】为啥 `virtualenv` 找不到 `pkg_resources`?【英文标题】:Why can't `virtualenv` find `pkg_resources`?为什么 `virtualenv` 找不到 `pkg_resources`? 【发布时间】:2012-05-19 14:52:30 【问题描述】:

我正在尝试在 Ubuntu 中使用 virtualenv 来安装本地虚拟 Python 环境。当我运行 shell 命令时:

$ virtualenv ./virt_python

它抛出一个无法导入pkg_resources 的异常。但是当我打开 Python shell 和 from pkg_resources import load_entry_point 它运行良好。作为参考,完整的堆栈跟踪如下。

$ virtualenv ./virt_python
New python executable in ./virt_python/bin/python
Installing setuptools............done.
Installing pip.......
  Complete output from command /home/rpsharp/local/...hon/bin/easy_install /usr/local/lib/pytho...pport/pip-1.1.tar.gz:
  Traceback (most recent call last):
  File "/home/rpsharp/local/workspace/invest-natcap.invest-3/virt_python/bin/easy_install", line 5, in <module>
    from pkg_resources import load_entry_point
ImportError: No module named pkg_resources
----------------------------------------
...Installing pip...done.
Traceback (most recent call last):
  File "/usr/local/bin/virtualenv", line 9, in <module>
    load_entry_point('virtualenv==1.7.1.2', 'console_scripts', 'virtualenv')()
  File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 928, in main
    never_download=options.never_download)
  File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 1042, in create_environment
    install_pip(py_executable, search_dirs=search_dirs, never_download=never_download)
  File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 640, in install_pip
    filter_stdout=_filter_setup)
  File "/usr/local/lib/python2.6/dist-packages/virtualenv.py", line 1006, in call_subprocess
    % (cmd_desc, proc.returncode))
OSError: Command /home/rpsharp/local/...hon/bin/easy_install /usr/local/lib/pytho...pport/pip-1.1.tar.gz failed with error code 1

我尝试了https://***.com/a/10538412/42897这里提出的解决方案,但没有任何效果。

【问题讨论】:

见***.com/questions/1756721/…和***.com/questions/7446187/… 【参考方案1】:

我在尝试运行 virtualenv 时遇到了同样的问题,发现 virtualenv 安装在 /home/user/install/lib/python2.7/site-packages 而 python 指向 /home/user /install/bin/virtualenv - 你应该通过运行知道这一点

which virtualenv

所以我不得不卸载并重新安装 virtualenv

pip uninstall virtualenv 
pip install virtualenv

这对我有用。

【讨论】:

我的 virtualenv 给出了一个不同的错误,“找不到 pip”,但有相同的“找不到***...”的症状,你的解决方案也对我有用。【参考方案2】:

问题是最近的版本从不下载 setuptools (distribute) 或 pip 并期望在本地找到它们的***。 通常 virtualenv 会说类似

Cannot find a wheel for setuptools
Cannot find a wheel for pip

之后出现 ImportError 失败。这是documented:

如果没有找到令人满意的本地发行版,virtualenv 将失败。 Virtualenv 永远不会下载包。

您可能需要检查您的环境中是否设置了 VIRTUALENV_EXTRA_SEARCH_DIR 或 virtualenv 的 config file 中的相应选项并禁用它。

要找出 virtualenv 实际搜索包的位置,您可以临时在/usr/local/lib/python2.6/dist-packages/virtualenv.pyimport pdb; pdb.set_trace() 中添加打印语句。有问题的函数是find_wheels,你让它看起来像这样:

def find_wheels(projects, search_dirs):
    # … skipping docstring and comments
    for project in projects:
        for dirname in search_dirs:
            print '*** search_dir:', dirname
            files = glob.glob(os.path.join(dirname, project + '-*.whl'))
            if files:
                wheels.append(os.path.abspath(files[0]))
                break
        else:
            logger.fatal('Cannot find a wheel for %s' % (project,))

    return wheels

【讨论】:

"只需放置从 PyPI 下载的相应 .whl 文件" 在哪里可以找到 pip*.whl 和 setuptools*.whl 文件@PyPI?抱歉,如果这是 LMGTFY,但我没有找到链接... @TomRoche 每个PyPI page 的底部都有一个表格。直接链接:pypi.python.org/packages/py2.py3/p/pip/…pypi.python.org/packages/3.4/s/setuptools/…【参考方案3】:

    检查 virtualenv 的当前版本。正如user2676043 在同一线程中回答的那样,virtualenv 安装在 /usr/local/lib/python2.7/dist-packages 中。所以运行以下命令:

    $ python /usr/local/lib/python2.7/dist-packages/virtualenv.py --version

它将返回系统上安装的 virtualenv 版本。

    现在,更改可执行文件。

    $ vim /usr/local/bin/virtualenv

将版本更改为上面收到的版本。保存文件,它可以顺利运行。

【讨论】:

以上是关于为啥 `virtualenv` 找不到 `pkg_resources`?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pip 冻结列表“pkg-resources==0.0.0”?

为啥 pip 冻结列表“pkg-resources==0.0.0”?

为啥我的 uWSGI 找不到我的 Django 应用程序?

pkg-config 找不到 opencv

pkg-config:PKG_PROG_PKG_CONFIG:找不到命令

Service Fabric:找不到 pkg\Debug