搜索路径和Python虚拟环境

时间:2016-11-29 22:16:21

标签: python

我在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”只包含从root /开始的目录,而不是我的虚拟环境?如何通过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

奇怪!那是为什么?

2 个答案:

答案 0 :(得分:1)

一般来说,对于虚拟环境,您需要进行安装,以便在虚拟环境激活时将您要导入的模块正确地预先挂在路径变量中。考虑尝试这个:

因为看起来你已经设置了虚拟环境,看起来你正在使用某种形式的Unix / Linux:

if rpa.lower() in ['y', 'yes', '1']:

然后您应该看到您的终端看起来像:

/home/abigail/environments/ $ source my_env/bin/activate

这意味着您拥有一个活跃的虚拟环境。

接下来,您应该安装所需的模块。我假设该模块可通过pip install获得。

(my_env) /home/abigail/environments

这应该让你全部设置好。当你检查你的sys路径时,你现在应该在它的前面看到你的虚拟环境python东西。并且您的导入错误应该消失。

如果出现问题,您可能需要删除手动放入目录的mglearn副本。

答案 1 :(得分:0)

VirtualEnv创建Python安装的克隆,并在sys.path中添加一条指向给定virtualenv的site-packages目录的附加路径。

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

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

which 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的二进制文件,它将自动包含sys.path上的/home/abigail/environments/my_env/lib/python3.5/site-packages位置。

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

  3. 您可以使用activate shell脚本(因为它只是非常简单的帮助程序脚本,您可以以任何合理的方式调整环境)。如果您只使用一个virtualenv,则可以将导出添加到〜/ .bashrc文件中,例如:

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

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