TL; DR находится в состоянии исправить в нижней части
Несколько замечаний, и они могут или не могут ответить на вопрос, но я думаю, что это немного лучше, чем сваливать все в комментарии. Они предполагают, что ваша среда активирована, для этих примеров моя среда называется new36
. Я также на MacOS с High Sierra 10.13.6.
Проверка 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
, это может быть частью проблемы.
Проверка пути импорта python
Вы должны быть в состоянии проверить, откуда Python получает файлы через sys.path
:
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
, ни какой-либо из установок Framework Python на моем Mac. import
будет искать эти каталоги ('' это cwd) в порядке , опуская первый экземпляр пакета, который он найдет. Если ваш sys.path
содержит элемент раньше, чем ваш conda env, который содержит pandas
, это ваша проблема.
многословный питон
Вы также можете проверить, откуда поступил пакет pandas, используя подробный режим python, python -v
:
# 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
site-packages. Поскольку 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', '', ...]