python - 搜索路径和Python虚拟环境

标签 python virtualenv virtual-environment

我正在 Python 3 的虚拟环境中工作。我需要使用第 3 方模块“mglearn”,并将其复制到我的虚拟环境的 lib/:

/home/abigail/environments/my_env/lib/python3.5/site-packages/mglearn

但是,在ipython命令行中,它找不到模块名称:

In [1]: import mglearn
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-e19748f92cd9> in <module>()
----> 1 import mglearn

ImportError: No module named 'mglearn'

它应该找到它,对吧?

然后我检查了我的sys.path:

In [4]: print(sys.path)
['', '/usr/bin', '/usr/lib64/python35.zip', '/usr/lib64/python3.5', '/usr/lib64/python3.5/plat-linux', '/usr/lib64/python3.5/lib-dynload', '/usr/lib64/python3.5/site-packages', '/usr/lib/python3.5/site-packages', '/usr/lib/python3.5/site-packages/IPython/extensions', '/home/abigail/.ipython']

为什么sys.path只包含从根/开始的目录,而不是我的虚拟环境?如何让 Python 搜索该模块?

编辑:

[abigail@localhost bin]$ ll activate
activate       activate.csh   activate.fish  
[abigail@localhost bin]$ ./activate
bash: ./activate: Permission denied
[abigail@localhost bin]$ sudo ./activate
sudo: ./activate: command not found

奇怪!这是为什么?

最佳答案

VirtualEnv 创建 Python 安装的克隆,并将附加路径烘焙到 sys.path 中,该路径指向给定 virtualenv 的 site-packages 目录。

当您启动 IPython 时,它可能已安装在您的主 Python 安装中,并且不知道您创建的任何其他虚拟环境。

如果您将 IPython 安装到虚拟环境中,它将知道该 virtualenv 的站点包位置。尝试并运行:

哪个 ipython

然后查看您的 ipython 脚本,您将看到它以以下任一开头:

#!/usr/bin/python

或者:

#!/home/abigail/environments/my_env/bin/python3

第一个表示全局安装的 ipython,第二个表示已安装到特定 virtualenv 中的 ipython。

仅供引用,您可以通过导出 PYTHONPATH 环境变量来添加 Python 解释器的路径:

```export PYTHONPATH=/home/abigail/environments/my_env/lib/python3.5/site-packages```

这将允许您在 virtualenv 中使用全局安装的 IPython。但是,执行此操作的典型方法是在 virtualenv 中安装 IPython 的第二个副本并使用该副本。

```/home/abigail/environments/my_env/bin/ipython```

virtualenv 的 activate shell 命令只做两件事:

  1. 将 virtualenv Python 解释器添加到您的 PATH 中。因此,当您输入 python3 时,您将运行 /home/abigail/environments/my_env/bin/python3 而不是 /usr/bin/python3。正是 /home/abigail/environments/my_env/bin/python3 中的二进制文件将自动包含 /home/abigail/environments/my_env/lib/python3.5/site-packages sys.path 上的位置。

  2. 更改您的 PS1 环境变量,以便您的终端出现提示,提醒您正在使用哪个 virtualenv。

是否使用 activate shell 脚本取决于您(因为它只是非常简单的帮助脚本,您可以以任何对您有意义的方式调整环境)。如果您只使用一个 virtualenv,则可以将导出添加到 ~/.bashrc 文件中,例如:

```export PATH=/home/abigail/environments/my_env/bin/:$PATH```

会自动让 python3 运行您的 virtualenv Python,就像在您的 virtualenv 中运行 source activate 一样。

关于python - 搜索路径和Python虚拟环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876767/

相关文章:

python - 多行正则表达式匹配

python - Ubuntu 上的 Flask 无法找到 Flask.json

python - virtualenv 不会复制标准模块,如 shutil 和 urllib2

python - 在 `pipenv shell` 产生 `pipenv install` 之后使用 "Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated."

python - WSL 上的 Virtualenv 创建的文件与 PowerShell 上的 Virtualenv 不同

python - 我怎样才能得到一个模型的相关对象和模型的 child 的相关对象的总数?

python - 大型 Python 随机共享器

python - 在python中将运算符传递给属性的优雅方式

python - 尝试导入 tensorflow 时出现非法硬件指令

python - 我是使用 `pyvenv` 还是 `virtualenv` 来创建虚拟环境?