无法使用Virtualenv通过pip安装

63
以下是我运行pip时收到的错误信息:
serkan$ rm -r mysite
serkan$ pwd
/Users/serkan/Desktop/Python Folder
serkan$ virtualenv mysite 
New python executable in mysite/bin/python
Installing setuptools............done.
Installing pip...............done.
serkan$ source mysite/bin/activate
(mysite)serkan$ pip install pinax
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$ python pip install pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip install Pinax
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ python pip 
python: can't open file 'pip': [Errno 2] No such file or directory
(mysite)serkan$ pip
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$ pip install Pinax
-bash: /Users/serkan/Desktop/Python Folder/mysite/bin/pip: "/Users/serkan/Desktop/Python: bad interpreter: No such file or directory
(mysite)serkan$ 

尝试使用 py -m pip install 运行它,这对我有效。 - PeJota
10个回答

129

在没有空格的路径下创建您的virtualenv环境。这就是为什么会出现这种情况:

当您创建一个环境时,它会设置一个bin目录。在该bin目录中,包含与环境相关的所有可执行文件,其中一些是脚本。如您所知,hashbang用于告诉系统要使用哪个解释器来运行脚本。您经常会在脚本顶部看到这个:

#!/usr/bin/env python

如果脚本位于 /tmp/test.py,那么这告诉系统运行以下命令来执行该脚本:

/usr/bin/env python /tmp/test.py
在你的情况下,virtualenv 正在创建像这样的脚本:
#!/tmp/oh no/bin/python
当系统尝试执行该命令时,它将会尝试使用参数no/bin/python/tmp/test.py来执行命令/tmp/oh。由于/tmp/oh不存在,因此执行失败。

10
在没有空格的路径下创建您的虚拟环境。这是有帮助的!谢谢。 - KMS
4
我也遇到了同样的错误,但是没有空格。后来发现问题在于你不能移动已经创建的 virtualenv(这是非常疯狂的做法……)。 - Alper
1
@alper: 它“有点支持”将它们移动到其他位置(http://www.virtualenv.org/en/latest/index.html#making-environments-relocatable)。 - icktoofay
1
谢谢,这为我解释了一切!我猜这意味着你不能在Google Drive文件夹内设置虚拟环境。 - GChorn
1
@GChorn:这可能有点取巧,但是您可以在没有空格的路径中设置符号链接到Google Drive文件夹。 - icktoofay
显示剩余7条评论

22

pip命令无法工作的原因有:

  • 您的系统中未安装pip。(您必须先在系统中安装pip,然后才能在虚拟环境中使用它。 在Ubuntu上安装pip,请使用命令sudo apt-get install python-pipsudo apt-get install python3-pip
  • 指向您的虚拟环境文件夹的路径包含空格。(例如:/home/username/my folder name with spaces/newvirtualenv)
  • 指向您的虚拟环境文件夹的路径太长。(例如:/home/username/mytoobigpath/somefolder/anotherfolder/someanotherfolder/someanotherfolderagain/myvirtualenv。)(尝试重命名父文件夹,使其名称更小)

如果由于某种原因无法重命名文件夹或更改路径,请前往yourvirtualenvfolder/bin(使用cd命令),然后尝试./python pip install packagename


5
你是一个英雄。很荒谬的是,pip不能处理空格,并且它没有明确地抛出那个错误。 - ProGirlXOXO
3
遇到了一个长路径问题。谢谢。 - Igal Karlinsky
1
有人知道 virtualenv 的长度限制吗? - Greg Hilston
2
由于 Jenkins 工作区名称的长度限制,我也遇到了字符限制,似乎限制为 79 个字符。这是一个运行在 CentOS7 AWS 虚拟机上的内核版本为 3.10.0-693.11.6.el7.x86_64 的问题。 - Connor
我必须将 python pip install packagename 替换为 ./python pip install packagename,否则它会使用系统 Python 而不是虚拟环境中的 Python。我无法编辑答案,因为编辑少于 6 个字符。 - kkpattern
@kkpattern 如果我理解正确的话,你无法更改或重命名virtualenv文件夹。我已经编辑了答案。 - Mohammed Shareef C

21

对于那些遇到此问题的人,我发现路径的长度也可能会导致问题,而不使用任何空格(Ubuntu 12.04):

virtualenv /home/user/some/very/longer/path/without/spaces/etc/venv

失败了,而

virtualenv /home/user/some/very/long/path/without/spaces/etc/venv

正常运行,可以参考下面Alex的评论


9
这不是对shell的限制,实际上与shell无关:这是内核在执行调用时对指定解释器(和参数)的长度所允许的限制,即“#!”魔数后面的内容。 在早期的Unix系统中,历史上大约为30个字符,在Linux中则接近80个字符。 - Alex North-Keys
现在,如果我们能让人们停止在命令名称上加.sh就好了。这样做有很多原因是非常错误的。 - Alex North-Keys
1
只是为了澄清,内核约束是BINPRM_BUF_SIZE,限制长度为127字节。更多信息:https://www.in-ulm.de/~mascheck/various/shebang/#length - Flat

14

icktoofay的说法是正确的,问题的原因就在于此。

要在带有空格的目录中使用虚拟环境中的pip,请编辑 /path/to/env/bin/pip 文件,在文件顶部将shebang替换为 #!/usr/bin/env python (如果您使用pypy,则替换为 #!/usr/bin/env pypy)。

请注意,virtualenv会更改您的环境,因此/usr/bin/env python 会指向由virtualenv定义的python版本。


@icktoofay,virtualenv 更改了由 env 定义的 PATH。因此,/usr/bin/env python 将引用 virtualenv 定义的 python - Bryan Head
你说得对。现在看来那很明显,但出于某种原因我错过了那个点。 - icktoofay
没问题。我已经修改了我的答案,使其更加清晰明了。 - Bryan Head
谢谢!在项目设置过程中的某个地方,我被告知要更改文件夹的名称,但我已经创建了虚拟环境。现在它不再允许我使用pip安装软件包。编辑bin/pip可执行文件并修复路径到新名称就解决了问题! :) - Luca Bezerra

2

在 Python 3.7 中,我没有遇到任何问题,但是当我需要使用 Python 3.6 时,出现了问题。我在 Github 上找到的最简单的解决方法是:

替换成以下内容:

pip install -r requirements.txt

我使用:

python env/bin/pip install -r requirements.txt

所以,实际上您直接指向虚拟环境目录中的pip文件。当然,在尝试此操作之前,您需要先激活它。希望这能帮助到来这里的某个人!

我不知道为什么它能够工作,但这是唯一对我有效的解决方案。谢谢! - Stav Shamir

1

我在RedHat上遇到了同样的错误。Python 2.7.3是我自己配置和编译的。

[root@Ifx installer]# pip install Django
-bash: /usr/local/bin/pip: /usr/local/bin/python2.7: bad interpreter: Permission denied

解决方案:在/usr/local/bin/pip中,将第一行#!/usr/local/bin/python2.7替换为您实际的Python路径#!/root/installer/Python-2.7.5/python

0
对于我的情况,取消激活环境然后再次执行“source bin/activate”命令可以解决问题。
看起来我的文件夹内容与“virtualenv”生成的子文件夹名称相同,例如bin、lib等。在复制了我的文件之后,重新激活环境会让“virtualenv”更新新的信息。

0

我在我的Windows 7机器上遇到了非常类似的问题,并且为此苦苦挣扎了几天。我的Python发行版和虚拟环境的路径都有空格。几个月前,它还能正常工作。我在virtualenv网站上找到了以下提示:

**Windows Notes**
[...] To create a virtualenv under a path with spaces in it on Windows, you’ll need the win32api library installed.

以下步骤带领我走向成功:
  1. 确保使用pip安装了virtualenv,并且是最新版本(pip-7.1.0)。结果:失败
  2. 安装win32api。结果:失败(虽然在安装过程的最后出现了一些错误)。
  3. 尝试在没有空格的路径中安装我的VE。结果:失败
  4. 重新安装我的Anaconda Python发行版到不包含“[”和“]”括号的路径中。VE路径中有空格。结果:失败
  5. 将我的Anaconda Python发行版重新安装到不包含任何空格的路径中。VE文件夹路径仍然包含空格。结果:成功!
因此,至少Anaconda(Python)安装简单,非空格污染路径至关重要。也许win32api的安装也很重要。不确定。

0

我在 Google 搜索中发现了这个问题,并发现这非常有用。现在,virtualenv 有一个 --relocatable 标志,它将重写 shebang 命令为 #!/usr/bin/env <the_python_version_you_used_to_create_the_virtualenv>。但是需要注意一些注意事项,请务必阅读文档以了解其影响:

https://virtualenv.pypa.io/en/stable/userguide/#making-environments-relocatable

您需要使用与创建虚拟环境时相同的语法来重新定位虚拟环境,否则可能会覆盖Python版本。这将按预期工作...

virtualenv --python=python3.5 env-test
virtualenv --relocatable --python=python3.5 env-test

而这将导致 #!/usr/bin/env python2.7(至少在我的本地环境中)...

virtualenv --python==python3.5 env-test
virtualenv --relocatable env-test

1
这对我并没有解决问题。 - nicbou

-1

1
错误明显是由于哈希邦出现了问题(已经解决)。请在发布快速答案之前仔细阅读。 - richardev

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