【问题标题】:virtualenv looking in the wrong place for easy_install & other filesvirtualenv 在错误的地方寻找 easy_install 和其他文件
【发布时间】:2016-03-29 11:02:45
【问题描述】:

不知何故,我在我的 mac 上搞砸了我的 python 2.7 安装,所以我尝试使用“brew install python”重新安装。现在,当我尝试创建一个新的 virtualenv 时,它会抛出一个关于找不到 /bin/easy_install 的错误。 easy_install 实际上在 /usr/local/bin/easy_install 中。如果我将它符号链接到 /bin,virtualenv 会失败并显示 /bin/pip 等等 - 它要查找的每个文件实际上都在 /usr/local/bin 而不是 /bin

我怎样才能让 virtualenv 永久显示在正确的位置:/usr/local/bin?

$ virtualenv env
New python executable in /Users/myusername/code/lambda/env/bin/python2.7
Also creating executable in /Users/myusername/code/lambda/env/bin/python
Installing setuptools, pip, wheel...
  Complete output from command /Users/myusername/c...da/env/bin/python2.7 -c "import sys, pip; sys...d\"] + sys.argv[1:]))" setuptools pip wheel:
  Ignoring indexes: https://pypi.python.org/simple
Collecting setuptools
Collecting pip
Collecting wheel
Installing collected packages: setuptools, pip, wheel
Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/req/req_set.py", line 646, in install
    **kwargs
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/req/req_install.py", line 803, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/req/req_install.py", line 998, in move_wheel_files
    isolated=self.isolated,
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/wheel.py", line 465, in move_wheel_files
    generated.extend(maker.make(spec))
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/_vendor/distlib/scripts.py", line 353, in make
    self._make_script(entry, filenames, options=options)
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/_vendor/distlib/scripts.py", line 257, in _make_script
    self._write_script(scriptnames, shebang, script, filenames, ext)
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/_vendor/distlib/scripts.py", line 231, in _write_script
    self._fileop.write_binary_file(outname, script_bytes)
  File "/usr/local/lib/python2.7/site-packages/virtualenv_support/pip-7.1.2-py2.py3-none-any.whl/pip/_vendor/distlib/util.py", line 388, in write_binary_file
    with open(path, 'wb') as f:
IOError: [Errno 13] Permission denied: '/bin/easy_install'
----------------------------------------
...Installing setuptools, pip, wheel...done.
Traceback (most recent call last):
  File "/usr/local/bin/virtualenv", line 9, in <module>
    load_entry_point('virtualenv==13.2.0.dev0', 'console_scripts', 'virtualenv')()
  File "/usr/local/lib/python2.7/site-packages/virtualenv.py", line 699, in main
    symlink=options.symlink)
  File "/usr/local/lib/python2.7/site-packages/virtualenv.py", line 872, in create_environment
    install_wheel(to_install, py_executable, search_dirs)
  File "/usr/local/lib/python2.7/site-packages/virtualenv.py", line 837, in install_wheel
    'PIP_USER': '0'
  File "/usr/local/lib/python2.7/site-packages/virtualenv.py", line 777, in call_subprocess
    % (cmd_desc, proc.returncode))
OSError: Command /Users/myusername/c...da/env/bin/python2.7 -c "import sys, pip; sys...d\"] + sys.argv[1:]))" setuptools pip wheel failed with error code 2

在输出的一半左右,您可以看到 virtualenv 正在寻找 /bin/easy_install

$ ls -al /bin/easy_install
ls: /bin/easy_install: No such file or directory

$ ls -al /usr/local/bin/easy_install
lrwxr-xr-x  1 myusername  admin  40 Dec 22 14:21 /usr/local/bin/easy_install -> ../Cellar/python/2.7.11/bin/easy_install

但它应该在 /usr/local/bin 中查找,因为这是我现在拥有的唯一 easy_install 并且它可以工作:

$ which easy_install
/usr/local/bin/easy_install

$ easy_install
install_dir /usr/local/lib/python2.7/site-packages/
error: No urls, filenames, or requirements specified (see --help)

我尝试 pip uninstall virtualenv 然后 pip install virtualenv 但这没有帮助 - 同样的问题。

有人知道如何解决这个问题吗?

谢谢!

=====================

编辑:解决了! 尝试使用 /usr/local/bin/virtualenv-2.7 并按预期工作。我将 /usr/local/bin/virtualenv 然后符号链接 /usr/local/bin/virtualenv-2.7 移回 /usr/local/bin/virtualenv --- 现在一切似乎都很好。

【问题讨论】:

  • // ,这可能是吹毛求疵,但我认为这样一个好问题值得一个更questioney 听起来的标题。这样其他像我这样迷路的人会更快找到它。你能把标题改成“我怎样才能让virtualenv在Python的正确位置:/usr/local/bin?”

标签: python python-2.7 pip virtualenv easy-install


【解决方案1】:

解决了!尝试使用 /usr/local/bin/virtualenv-2.7 并按预期工作。我将 /usr/local/bin/virtualenv 然后符号链接 /usr/local/bin/virtualenv-2.7 移回 /usr/local/bin/virtualenv --- 现在一切似乎都很好。

【讨论】:

    【解决方案2】:

    我编译了自己的 Python 3,然后安装了 virtualenvwrapper。但是在我从编译自己的 Python 切换到使用 deadsnakes PPA 之后,我遇到了上述问题中描述的问题。

    virtualenv 脚本的#! 部分似乎有问题。

    我得到的错误如下:

    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ mkvirtualenv --python='/usr/bin/python3' redispytest
    bash: /home/nb/.local/bin/virtualenv: /usr/local/bin/python3.6: bad interpreter: No such file or directory
    

    我的系统 Python 设置具有以下符号链接和 Python 位置:

    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ ls -la /usr/bin/python3
    lrwxrwxrwx 1 root root 9 Feb  8 11:43 /usr/bin/python3 -> python3.5
    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ ls -la /usr/bin/python3.5
    -rwxr-xr-x 2 root root 4464400 Nov 28 08:53 /usr/bin/python3.5
    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ which python3.5
    /usr/bin/python3.5
    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ ls -la /usr/bin/python3.5
    -rwxr-xr-x 2 root root 4464400 Nov 28 08:53 /usr/bin/python3.5
    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ ls -la /usr/bin/python3.6
    -rwxr-xr-x 2 root root 4695328 Jan 28 10:49 /usr/bin/python3.6
    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ which virtualenv
    /home/nb/.local/bin//virtualenv
    

    而且,在 /home/nb/.local/bin/¹:

    nb@ubuntu-0xA520322HC30H:~/proj/redis-py$ cd ~/.local/bin
    nb@ubuntu-0xA520322HC30H:~/.local/bin$ ls
    pbr  pip2    pip3    virtualenv        virtualenvwrapper_lazy.sh
    pip  pip2.7  pip3.5  virtualenv-clone  virtualenvwrapper.sh
    

    我想知道这个神秘且完全不存在的 /usr/local/bin/python3.6 在代码中的什么位置。

    所以我安装了一个全文搜索工具并在 ~/.local 文件夹中查找它。

    nb@ubuntu-0xA520322HC30H:~$ cd .local
    nb@ubuntu-0xA520322HC30H:~/.local$ sudo apt-get install --quiet --quiet silversearcher-ag
    nb@ubuntu-0xA520322HC30H:~/.local$ ag '/usr/local/bin/python3.6'
    bin/virtualenv-clone
    1:#!/usr/local/bin/python3.6
    
    bin/pbr
    1:#!/usr/local/bin/python3.6
    

    看起来像是在 2 个地方对 Python 的静态引用。

    我现在有两个选择:

    1. 我可以编辑其中的 /usr/local/bin/python3.6 文本以引用 /usr/bin/python3.6

    2. 我可以从 /usr/local/bin/python3.6 创建符号链接 -> /usr/bin/python3.6

    我选择了bin/virtualenv-clone 文件的选项 1:

    但我也做了选项 2,以防我系统的其他地方存在这个问题。

    nb@ubuntu-0xA520322HC30H:~$ sudo ln -s /usr/bin/python3.6 /usr/local/bin/python3.6
    

    好吧,不管它是什么,它都有效:

    nb@ubuntu-0xA520322HC30H:~/.local$ mkvirtualenv --python='/usr/bin/python3' redispytest
    Running virtualenv with interpreter /usr/bin/python3
    Using base prefix '/usr'
    New python executable in /home/nb/Envs/redispytest/bin/python3
    Also creating executable in /home/nb/Envs/redispytest/bin/python
    Installing setuptools, pip, wheel...done.
    virtualenvwrapper.user_scripts creating /home/nb/Envs/redispytest/bin/predeactivate
    virtualenvwrapper.user_scripts creating /home/nb/Envs/redispytest/bin/postdeactivate
    virtualenvwrapper.user_scripts creating /home/nb/Envs/redispytest/bin/preactivate
    virtualenvwrapper.user_scripts creating /home/nb/Envs/redispytest/bin/postactivate
    virtualenvwrapper.user_scripts creating /home/nb/Envs/redispytest/bin/get_env_details
    (redispytest) nb@ubuntu-0xA520322HC30H:~/.local$
    

    总结:找出您的 virtualenv 尝试使用的解释器位置,并从该位置创建一个符号链接到您的实际 Python。

    您需要这样做的原因是,至少有几个 virtualenv 位置将有一个指向特定位置的 #! 行,但如果您从编译自己的 Python 切换到使用购电协议。

    起初我犹豫不决,因为我更喜欢让包管理器来处理这类事情,而不是让我的路径过于复杂。但似乎真的没有其他方法可以解决这个问题。我尝试卸载并重新安装virtualenvvirtualenvwrapper,但无济于事。

    ¹嗯……我的 .local/bin 中有 pbr。接下来是什么,我的 .local/fridge?该死的潮人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多