未隔离conda虚拟环境中的pip安装的软件包

时间:2019-10-17 00:33:58

标签: python pip anaconda conda

我正在开发一个简单的python软件包(在macOS 10.14上),并且在设置说明中存在安装问题。现在,该软件包尚无处可用,但可以将其视为虚拟“ hello world”模块,在虚拟“ hello world”模块中具有虚拟“ hello world”功能。当然,它具有适当的setup.py脚本,该脚本将允许用户使用pip安装和卸载软件包。
当我自己安装和测试它时,一切正常,问题与软件包本身无关。
问题是我无法使conda虚拟环境和pip协同工作... setup.py脚本旁边有一个environment.yaml文件,该文件指定了程序包所需的依赖关系。基于此文件,我使用以下命令创建虚拟环境:

conda env create --prefix ENV -f environment.yaml

我在内部具有Python 3.7.3的conda 4.7.12,因此虚拟环境具有自己的pip。因此,我激活了虚拟环境,并显式调用其中的pip将软件包安装在虚拟环境中:

/Users/my_name/Desktop/dev_dir/ENV/bin/pip install . --user

安装成功,可以导入软件包。但是,当我使用conda deactivate停用虚拟环境并从conda base环境(版本3.6.9)运行python解释器时,我仍然可以加载我的包!由于某种原因,它在特定的虚拟环境之外可用...

稍后,当我从conda base shell运行“内部”点时:

/Users/my_name/Desktop/dev_dir/ENV/bin/pip uninstall pkg

删除似乎也要进行。我收到一条消息:

Uninstalling pkg-0.0.0.9000:
  Would remove:
    /Users/my_name/.local/lib/python3.7/site-packages/pkg-0.0.0.9000.dist-info/*
    /Users/my_name/.local/lib/python3.7/site-packages/pkg/*
Proceed (y/n)? y
  Successfully uninstalled pkg-0.0.0.9000

建议该软件包确实安装在conda虚拟环境之外的目录.local中。

最后一个是最好的:即使在卸载后,当我运行python解释器时(无论来自哪个环境),我都尝试import pkg仍然有效!然后,当我在解释器中输入pkg时,将获得开发目录的路径:

>>> import pkg
>>> pkg
<module 'pkg' from '/Users/my_name/Desktop/dev_dir/pkg/__init__.py'>

有人可以帮我解开这个烂摊子吗?我想将我的软件包安装在虚拟环境中,很好地隔离。而且-卸载后应该消失了吧?

PS。 PYTHONPATH变量永远不会在任何阶段设置,我一直在检查...

3 个答案:

答案 0 :(得分:2)

  

当我在解释器中键入pkg时,我会获得开发目录的路径

仅在以下情况下会发生这种情况

  1. 您已将PYTHONPATH修改为包括/Users/my_name/Desktop/dev_dir,而您没有这么做
  2. 您在文件夹/Users/my_name/Desktop/dev_dir中时正在运行解释器,好像您将其称为开发文件夹一样。

检查print(sys.path)的输出,该输出列出执行import(标准位置+ PYTHONPATH)时搜索的所有目录,以及print(os.getcwd()),因为当前工作目录为还搜索了


您尝试使用

将软件包安装到激活的conda环境中
/Users/my_name/Desktop/dev_dir/ENV/bin/pip install . --user

但是,请看[docs](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-user]

  

--user

     

安装到您平台的Python用户安装目录。通常为~/.local/

因此--user选项与您打算安装到当前活动环境中的意图相混淆。但是pip实际上是在虚拟环境中运行时默认执行的。只需这样做:

conda activate <your envname>
pip install .

答案 1 :(得分:1)

@FlyingTeller already correctly identified the issue。我只是想指出,您可以通过将软件包的安装添加到YAML定义中来进一步简化流程。例如,

name: my_env
channels:
 - defaults
dependencies:
 - python=3.7.3
 - pip
 - pip:
   - -e /Users/my_name/Desktop/dev_dir/pkg

这也与最佳做法保持一致(请参阅“ Using Pip in a Conda Environment”)。

答案 2 :(得分:0)

只是希望通过告诉您许多情况经常发生而清除一些错误,如果您忘记了没有使用conda进行root安装的规则,则文件的所有规则都可能会更改,并且突然它不断要求sudo并失败。康达=没有SUDO希望您已解决问题!