Как отдать приоритет пакету conda над pip one? - PullRequest
1 голос
/ 03 июня 2019

С активированной виртуальной средой я вижу с conda list, что моя версия pandas - 0.24.0. Когда я делаю то же самое с pip list, я вижу версию 0.22.0 (возможно, более старую версию, которую я установил перед использованием conda). Когда я импортирую панд в python (3.6), версия для панд - 0.22.0.

Почему и как форсировать загрузку пакета conda?

РЕДАКТИРОВАТЬ: MacOS High Sierra 10.13.1

1 Ответ

1 голос
/ 03 июня 2019

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', '', ...]
...