如何优先使用conda软件包而不是pip one?

时间:2019-06-03 15:31:12

标签: python pandas pip package conda

激活我的虚拟环境后,用conda list可以看到我的熊猫版本是0.24.0。当我对pip list执行相同操作时,我看到版本是0.22.0(可能是在使用conda之前安装的较旧版本)。当我在python(3.6)中导入熊猫时,熊猫版本为0.22.0。

为什么以及如何强制加载conda包装?

编辑:MacOS High Sierra 10.13.1

1 个答案:

答案 0 :(得分:1)

TL; DR可能位于底部

一些注释,这些注释可能会也可能不会回答问题,但是我认为这比将所有内容都放入注释中要好一些。这些假设您的环境已激活,对于这些示例,我的环境称为new36。我也在使用High Sierra 10.13.6的MacOS上。

检查condapip的位置

首先,让我们检查一下以确保condapip都在同一环境中查找。要查找有关conda的信息,请检查:

conda info

我得到以下信息:

active environment : new36
    active env location : /Users/mm92400/anaconda3/envs/new36
            shell level : 1
       user config file : /Users/mm92400/.condarc
 populated config files : /Users/mm92400/.condarc
          conda version : 4.6.8
    conda-build version : 3.0.27
         python version : 3.6.3.final.0
# extra info excluded

active env location是我们所关心的。该目录应该包含pip的目录:

which pip | head -n 1

/Users/mm92400/anaconda3/envs/new36/bin/pip

如果pip不在conda所在的目录中,则可能是问题的一部分。

验证python的导入路径

您应该能够通过sys.path来检查python从哪里获取文件:

import sys

sys.path
['', '/Users/mm92400/anaconda3/envs/new36/lib/python36.zip', '/Users/mm92400/anaconda3/envs/new36/lib/python3.6', '/Users/mm92400/anaconda3/envs/new36/lib/python3.6/lib-dynload', '/Users/mm92400/anaconda3/envs/new36/lib/python3.6/site-packages']

这是list,需要注意。请注意,我的sys.path没有基于conda基本安装的文件/文件夹中的任何目录,也没有Mac上任何python的Framework安装。 import将按以下顺序搜索这些目录(“ cwd”) ,并下拉找到的包的第一个实例。如果您的sys.path的元素早于包含pandas的conda env元素,这就是您的问题。

详细的蟒蛇

您还可以使用python python -v的详细模式来验证pandas软件包的来源:

# you have gotten here by running python -v in the terminal
# there's a whole bunch of comments that pop out that I'm going to omit here

# Now run
import pandas

~snip~
# code object from '/Users/mm92400/anaconda3/envs/new36/lib/python3.6/site-packages/pandas/__pycache__/_version.cpython-36.pyc'
import 'pandas._version' # <_frozen_importlib_external.SourceFileLoader object at 0x107952b00>
import 'pandas' # <_frozen_importlib_external.SourceFileLoader object at 0x104572b38>

请注意code object路径与我期望python从哪里获取该软件包的位置匹配

可能的修复

您可以在sys.path上进行修改,尽管我不确定这样做的建议。您可以在sys.path中确定目录的优先级,而无需在脚本中修改sys.path,例如:

env PYTHONPATH=$(find $CONDA_PREFIX -type d -name "site-packages" | head -n 1) python

它将带您进入口译员,而sys.path看起来像:

import sys
sys.path
['', '/Users/mm92400/anaconda3/envs/new36/lib/python3.6/site-packages', ...]

现在要检查的第一个目录是conda env网站软件包。由于sys.pathlist,因此将按顺序遍历它。确定要使用的目录优先级的方法是先将特定目录注入sys.path中。如果我要编写如下脚本:

import sys

print(f"I prioritized {sys.path[1]}")

然后使用env PYTHONPATH=$(find $CONDA_PREFIX -type d -name "site-packages" | head -n 1) python somefile.py运行它,我会得到:

env PYTHONPATH=$(find $CONDA_PREFIX -type d -name "site-packages" | head -n 1) python somefile.py
I prioritized /Users/mm92400/anaconda3/envs/new36/lib/python3.6/site-packages

或者,您可以insert进入sys.path,但是我可以明确地说这是推荐的并且很脆弱:

import os, sys

try:
    conda_env = os.environ['CONDA_PREFIX']
except KeyError:
    raise KeyError("The env var $CONDA_PREFIX was not found. Please check that your conda environment was activated")

for root, dirs, files in os.walk(conda_env):
    if 'site-packages' in dirs:
        syspath_add = os.path.join(root, 'site-packages')
        break
else:
    raise FileNotFoundError("Couldn't find site-packages!")

sys.path.insert(0, syspath_add)

sys.path
# ['/Users/mm92400/anaconda3/envs/new36/lib/python3.6/site-packages', '', ...]