如何在虚拟环境中安装软件包?

103

我使用了以下命令创建了一个虚拟环境。

mkvirtualenv --distribute --system-site-packages "$1"
在使用workon命令启动虚拟环境后,我输入ipython。它会提示我。
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
当我尝试使用virtualenv安装ipython时,出现以下错误信息:
pip install ipython
Requirement already satisfied (use --upgrade to upgrade): ipython in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
Cleaning up...

有人知道如何在虚拟环境中安装吗?


很可能pip没有作为您的虚拟环境的一部分安装。因此,您需要先安装pip才能将库安装到您的venv中。 - poke
你是在虚拟环境中进行pip安装(先激活虚拟环境,然后再安装ipython)吗? - Perefexexos
这个问题是关于第三方插件mkvirtualenv的。现代Python 3的解决方案是只使用venv模块,它是Python标准库的一部分,尽管有一些第三方虚拟环境管理器提供了一些不同的功能和思维模型。这里的几个答案都是关于标准的venv模块,其他的则是关于流行的第三方模块virtualenv;我相信mkvirtualenv与两者都无关。 - tripleee
11个回答

106

避免头痛和最佳实践:

  • 虚拟环境不是您的git项目的一部分(它们不需要进行版本控制)!

  • 它们可以驻留在项目文件夹(本地),但要在您的.gitignore中忽略。

  • 在激活项目的虚拟环境后,永远不要使用“sudo pip install package”。

  • 完成工作后,始终“deactivate”您的环境。

  • 避免重命名项目文件夹。



为了更好的表示,以下是一个模拟:

创建用于项目/环境的文件夹

$ mkdir envs

创建环境

$ cd envs/ 

$ virtualenv google_drive
New python executable in google_drive/bin/python
Installing setuptools, pip...done.

激活环境

$ source google_drive/bin/activate

安装软件包

(google_drive) $ pip install PyDrive
Downloading/unpacking PyDrive
Downloading PyDrive-1.3.1-py2-none-any.whl
...
...
...    
Successfully installed PyDrive PyYAML google-api-python-client oauth2client six uritemplate httplib2 pyasn1 rsa pyasn1-modules
Cleaning up...

环境内可用的软件包

(google_drive) $ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pydrive.auth
>>>  
>>> gdrive = pydrive.auth.GoogleAuth()
>>>

停用环境

(google_drive) $ deactivate 

$ 

包在环境外不可用

$ python
Python 2.7.6 (default, Oct 26 2016, 20:32:10) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pydrive.auth
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pydrive.auth
>>> 

注:

为什么不使用sudo?

Virtualenv 为您创建一个全新的环境,定义 $PATH 和其他一些变量和设置。当您使用 sudo pip install package 时,您正在作为 root 运行 Virtualenv,跳过了创建的整个环境,然后在全局 site-packages 上安装软件包,而不是安装在项目文件夹内您已经激活了环境。

如果您重命名项目文件夹...

...则需要调整项目目录中 bin 目录内某些文件的变量。

例如:

bin/pip,第1行(She Bang)

bin/activate,第42行(VIRTUAL_ENV)


2
请在“从未使用sudo pip安装软件包”部分加1。 - Walid Mashal
2
@ivanleoncz,你的解释非常有帮助。但我还有另一个问题,没有sudo权限下,我无法在virtualenv中安装软件包。你能提供一些建议吗? - Gopi P
如何从Python 2.7切换到Python 3.6? - Etisha
我已经重命名了项目,但在 pip 坚称 "已满足" 的同时出现了奇怪的 "没有模块" 错误。 我从未想象过 venv 中的路径。 如果能指出确切的文件和行号,我将会给你加 1000 分! - fernandojmartin
1
“mkdir venv”和“cd venv”在这里是错误的。如果您还没有这样做,您可能想要“mkdir your_project”和“cd your_project”,但将项目称为“venv”只会让人感到困惑。 - tripleee
显示剩余3条评论

38

如果您不希望虚拟环境能够使用外部库,请使用--no-site-packages选项创建您的虚拟环境:

virtualenv --no-site-packages my-virtualenv
. my-virtualenv/bin/activate
pip install ipython
否则,就像您的例子一样,它可以将在您的系统Python环境中安装的库视为满足您请求的依赖项。
否則,就像您的例子一樣,它可以將在您的系統Python環境中安裝的庫視為滿足您請求的依賴項。

19
一般情况下,应避免使用 --system-site-packages。该标志违背了虚拟环境的整个目的(这也是为什么几个版本之前将 --no-site-packages 设为默认值的原因)。 - Max Noel
--system-site-packagesvirtualenv 20.0.17 上不受支持(会出现错误)。 - Antoine Dahan

21

针对 Python 3:

### install library `virtualenv`
$ pip3 install virtualenv

### call module `venv` with the name for your environment
$ python3 -m venv venv_name

### activate the created environment
$ source venv_name/bin/activate  #key step
    
### install the packages
(venv_name) user@host: pip3 install "package-name"

请问您能否解释一下 -m 参数和 source 命令的作用? - Alex 75
3
我的电脑(Win 10)上找不到“source”。我使用“.{venv_name}\Scripts\activate”进入虚拟环境,然后简单地使用“deactivate”退出虚拟环境。 - Alex 75
python3 -m 调用带有某个 module 的 Python ;) - Curious Watcher
3
pip3 install virtualenv is completely unnecessary here; you are installing a third-party package but then never using it. The venv package is part of the Python standard library, though on some platforms (notably Debian and derived distros like Ubuntu and Mint) it has been split off to a separate package which needs to be installed first; apt-get install python3-pip python3-venv - tripleee
1
@Alex75 - 答案中提到的 source 命令是针对 Linux 的。对于 Windows,您可以运行 .\{venv_name}\Scripts\activate.bat - Sidharth Ramesh

10

我没有关于为什么会出现这种行为的合适理由,但我发现了一个小技巧。

在虚拟环境中

pip install -Iv package_name==version_number

现在这个命令将会在你的虚拟环境中安装该版本

此外,你可以使用以下命令在虚拟环境中检查

pip install yolk
yolk -l

以下内容将为您提供系统和虚拟环境中所有已安装软件包的详细信息。

尽管有人可能会说使用 --system-site-packages 不太恰当(这可能是正确的),但如果您已经在虚拟环境中完成了很多工作,现在您不想从头开始重新做一切,该怎么办呢?

您可以使用此方法进行“黑科技”,但下次请小心 :)


7
为了使用virtualenv创建的环境,您需要首先 source env/bin/activate。之后,只需使用 pip install package-name 安装软件包即可。

6

您可以进入存在venv的文件夹,右键单击->git bash here. 然后只需输入python -m pip install ipython,它将安装在文件夹内。

我发现使用virtualenv包更加方便,它会在项目文件夹内创建venv。


5
进一步阐明其他答案:

在当前版本的virtualenv下,--no-site-packages标志是默认行为,因此您不需要指定它。但是,通过显式使用--system-site-packages标志来覆盖默认设置,这可能不是您想要的。默认行为(未指定任何标志)是创建虚拟环境时使其无法访问环境外安装的任何Python包。通常这是正确的选择,因为它最好地将虚拟环境与本地计算机环境隔离开来。在环境内安装的Python包不会影响本地计算机,反之亦然。

其次,在创建虚拟环境后,您需要进入虚拟环境目录,然后运行:

bin/activate

这样做的目的是配置环境变量,使得Python包和虚拟环境bin文件夹中的可执行文件在您本地计算机上标准位置中的那些之前被使用。例如,当您键入“pip”时,虚拟环境内的pip版本将代替本地机器上的pip版本运行。这很有必要,因为虚拟环境中的pip将安装在虚拟环境内的包。
您遇到的问题是由于您正在从本地计算机运行程序(例如ipython),而实际上您希望安装并运行这些程序的副本被隔离在虚拟环境中。您可以通过创建环境(如果您使用当前版本,则不需要指定任何site-packages标志),然后运行上面提到的activate脚本,最后运行pip来安装所需的任何包(它们将放置在环境内)。

嗨,截至目前(2018年4月),我们必须运行“source bin/activate”命令。如果没有source命令,什么也不会发生。其他的解释都很好。 - Nikhil VJ
另外,仅为完整性,请运行“deactivate”以退出虚拟环境。 - Nikhil VJ

3

根据https://docs.python.org/3/library/venv.html文档:

自Python 3.6起,pyvenv脚本已被弃用,建议使用python3 -m venv来避免任何潜在的混淆,以确定虚拟环境将基于哪个Python解释器。

为了为特定项目创建虚拟环境,请创建一个文件/home/user/path/to/create_venv.sh

#!/usr/bin/env bash

# define path to your project's directory
PROJECT_DIR=/home/user/path/to/Project1

# a directory with virtual environment
# will be created in your Project1 directory
# it recommended to add this path into your .gitignore
VENV_DIR="${PROJECT_DIR}"/venv

# https://docs.python.org/3/library/venv.html
python3 -m venv "${VENV_DIR}"

# activates the newly created virtual environment
. "${VENV_DIR}"/bin/activate

# prints activated version of Python
python3 -V

pip3 install --upgrade pip

# Write here all Python libraries which you want to install over pip
# An example or requirements.txt see here:
# https://docs.python.org/3/tutorial/venv.html#managing-packages-with-pip
pip3 install -r "${PROJECT_DIR}"/requirements.txt

echo "Virtual environment ${VENV_DIR} has been created"

deactivate

请在控制台中运行以下脚本:
$ bash /home/user/path/to/create_venv.sh

1
注意:人们必须先安装“sudo apt-get install python3-venv”。我在没有安装它的情况下运行了您的脚本,它会友好地报错第一个命令,告诉我这一点,然后继续尝试在我的主要Python中安装要求! - Nikhil VJ

2
我曾经遇到同样的问题,使用--no-site-packages并没有解决它。我在旧的邮件列表档案中发现了这个解决方法:您可以通过pip命令的-U标志,在virtualenv中强制安装ipython,例如:pip -U ipython。您可以在virtualenv环境下,使用bash命令which ipython验证其是否有效。
来源:https://mail.python.org/pipermail/python-list/2010-March/571663.html

1

在Ubuntu和Windows上分享我的经验,内容涉及编程,这是针对python3的。要想在python2中实现,请将“3”替换为“2”:

Ubuntu

pip install virtualenv --user
virtualenv -p python3 /tmp/VIRTUAL
source /tmp/VIRTUAL/bin/activate
which python3

安装任意软件包: pip install package

退出虚拟环境: deactivate

重新激活: source /tmp/VIRTUAL/bin/activate

完整说明请点击此处

Windows

(假设您已经安装了MiniConda,并在开始菜单中找到Anaconda Terminal)

conda create -n VIRTUAL python=3  
activate VIRTUAL

安装任何包: pip install 包名 或者 conda install 包名 退出虚拟环境:deactivate 重新激活虚拟环境:activate VIRTUAL 点击此处查看完整说明

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