激活我的虚拟环境后,用conda list
可以看到我的熊猫版本是0.24.0。当我对pip list
执行相同操作时,我看到版本是0.22.0(可能是在使用conda之前安装的较旧版本)。当我在python(3.6)中导入熊猫时,熊猫版本为0.22.0。
为什么以及如何强制加载conda包装?
编辑:MacOS High Sierra 10.13.1
答案 0 :(得分:1)
一些注释,这些注释可能会也可能不会回答问题,但是我认为这比将所有内容都放入注释中要好一些。这些假设您的环境已激活,对于这些示例,我的环境称为new36
。我也在使用High Sierra 10.13.6的MacOS上。
conda
与pip
的位置首先,让我们检查一下以确保conda
和pip
都在同一环境中查找。要查找有关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
所在的目录中,则可能是问题的一部分。
您应该能够通过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.path
是list
,因此将按顺序遍历它。确定要使用的目录优先级的方法是先将特定目录注入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', '', ...]