Как отслеживать пакеты, установленные с помощью pip, в среде Anaconda (Conda)?

141

Я установил и использую дистрибутив Anaconda Python, и я начал использовать среду Anaconda (Conda). Я могу использовать стандартную conda install...команду для помещения пакетов из дистрибутива в свои среды, но для использования чего-либо внешнего (например, Flask-WTF, flask-sqlalchemy и alembic) мне нужно использовать pip installв активной среде. Однако, когда я смотрю на содержимое среды, либо в каталоге, либо с использованием conda listэтих pip installпакетов ed, они не отображаются.

Использование pip freezeи pip listпросто перечисляет все пакеты, которые я когда-либо устанавливал.

Есть ли способ отслеживать, что находится в каждой из моих Anaconda env(как в обеих, так pipи в condaустановленных)?

Громичек
источник
7
Используйте pipустановленный conda, например ~/anaconda/bin/pip. Используйте его для установки пакетов в condaсреду, а также для просмотра объединения пакетов, установленных с этим pipи с conda install.
Сергей Оршанский
7
conda listкакое-то время теперь включает пакеты Python, которые были установлены другими способами (например, pip, easy-install, напрямую с помощью python setup.py installи т. д.)
kalefranz
1
Не обновляйте свой пип, иначе этот экспорт попадет в шланг
Эндрю Кэссиди

Ответы:

120

conda-env теперь делает это автоматически (если pip был установлен с conda).

Вы можете увидеть, как это работает, используя инструмент экспорта, используемый для миграции среды:

conda env export -n <env-name> > environment.yml

В файле будут перечислены как пакеты conda, так и пакеты pip:

name: stats
channels:
  - javascript
dependencies:
  - python=3.4
  - bokeh=0.9.2
  - numpy=1.9.*
  - nodejs=0.10.*
  - flask
  - pip:
    - Flask-Testing

Если вы хотите завершить экспорт среды, перейдите environment.ymlна новый хост-компьютер и запустите:

conda env create -f path/to/environment.yml
conner.xyz
источник
Чтобы прояснить это для будущих читателей: в -pip:разделе отмечены все пакеты, которые были установлены через pip. Кроме того, насколько мне известно, conda env export никогда не будет генерироваться значения соответствия семвар , как -nodejs=0.10.*показано в этом примере. Это даст явное значение, например, -nodejs=0.10.1и вам нужно будет поставить, *если это то, что вы хотите. Если бы он мог обрабатывать сопоставление семваров, это было бы здорово, и я был бы рад услышать, как сделать это волшебство. :)
Майк Уильямсон
64

condaбудет отслеживать только установленные пакеты. И pipпредоставит вам пакеты, которые были либо установлены с помощью самого pipустановщика, либо они использовали setuptoolsв своей setup.pyсборке, поэтому сборка conda сгенерировала информацию о яйцах. Итак, у вас есть три основных варианта.

  1. Вы можете объединить пакеты conda listи pip freezeи управлять пакетами, которые были установлены с помощью conda(которые показаны в conda list), с помощью condaдиспетчера пакетов, а те, которые установлены с помощью pip(которые отображаются, pip freezeно не входят conda list), с помощью pip.

  2. Установите в среде только python, pipи distributeпакеты и управлять всем с pip. (Это не так тривиально, если вы работаете в Windows ...)

  3. Создавайте собственные condaпакеты и управляйте всем с помощью conda.

Я бы лично порекомендовал третий вариант, поскольку создавать condaпакеты очень просто . В github-аккаунте континуума есть репозиторий примеров рецептов. Но обычно все сводится к:

 conda skeleton pypi PACKAGE
 conda build PACKAGE

или просто:

conda pipbuild PACKAGE

Также, когда вы создали их один раз, вы можете загрузить их на https://binstar.org/ и просто установить оттуда.

Тогда у вас все получится с помощью conda.

Виктор Керкез
источник
3
Я просто пытался ~/anaconda/bin/pip install memory-profilerи conda install numba, и они оба показаны в ~/anaconda/bin/pip freeze.
Сергей Оршанский
2
"git репозиторий примеров рецептов в аккаунте github континуума" Вы имеете в виду github.com/ContinuumIO/anaconda-recipes ? Пожалуйста, дайте ссылку, если можете
endolith
Однако на самом деле это не устанавливает пакет, чтобы вы могли его импортировать. Вы должны сделать, conda install C:\...PACKAGE-0.0.0-py27_0.tar.bz2как описано в stackoverflow.com/a/20750388/125507
endolith
Я бы сказал, что сначала всегда используйте conda install python=3.x.yсреду conda, чтобы последующие установки pip проходили через установленную pip conda.
Устаман Сангат
24

Существует ветка conda (new-pypi-install), которая добавляет лучшую интеграцию с pip и PyPI. В частности, в списке conda также будут показаны установленные пакеты pip, и установка conda сначала попытается найти пакет conda, и в случае сбоя, который будет использовать pip для установки пакета.

Планируется, что эта ветка будет объединена позже на этой неделе, чтобы версия 2.1 conda имела лучшую интеграцию pip с conda.

Трэвис Олифант
источник
2
Хочу отметить, что это уже работает в conda 2.2.3 (и, вероятно, до этого). Это работает так: если вы попытаетесь это сделать, conda install packageа он не сможет найти рецепт conda, он попытается установить его через pip(а затем отслеживает его). Он даже предлагает установить, pipесли не в вашей среде. Спасибо Трэвису за всю вашу работу!
Хорхека 05
5
Разъяснение, поскольку я несколько раз неправильно это читал. @Travis означает, что я думаю, что если кто-то работает внутри conda, то запущенный pip сначала будет искать пакеты conda? Обратное определенно неверно - conda install не ищет пакеты pypi, даже элементы на pypi.binstar.org. Это по состоянию на conda 3.5.2.
AnneTheAgile
9
Это было удалено? Если я запускаю, скажем, conda install autopep8он сообщает мне: «Пакет не найден» и что мне нужно выполнить поиск на anaconda.org вручную.
Эндолит
@AnneTheAgile running pip...тоже не работает, он вообще не будет искать пакет conda.
Ван
16

Я последовал за ответом @Viktor Kerkez и имел смешанный успех. Я обнаружил, что иногда этот рецепт

conda скелет pypi ПАКЕТ

conda build ПАКЕТ

будет выглядеть так, будто все работает, но мне не удалось успешно импортировать ПАКЕТ. Недавно я спросил об этом в группе пользователей Anaconda и услышал от самого @Travis Oliphant, как лучше всего использовать conda для создания пакетов, которые не поставляются с Anaconda, и управления ими. Вы можете прочитать эту ветку здесь , но я опишу подход ниже, чтобы, надеюсь, сделать ответы на вопрос OP более полными ...

Пример: я собираюсь установить отличный пакет prettyplotlib в Windows с помощью conda 2.2.5.

1а) conda build --build-recipe prettyplotlib

Вы увидите, что все сообщения сборки выглядят хорошо до последнего раздела ТЕСТ сборки. Я видел эту ошибку

Файл "C: \ Anaconda \ conda-bld \ test-tmp_dir \ run_test.py", строка 23 import None SyntaxError: невозможно присвоить значение None TESTS FAILED: prettyplotlib-0.1.3-py27_0

1b) Зайдите в / conda-recipes / prettyplotlib и отредактируйте файл meta.yaml. В настоящее время пакеты, настраиваемые, как на шаге 1a, приводят к файлам yaml с ошибкой в testразделе. Например, вот как я искалprettyplotlib

test:   # Python imports   imports:
    - 
    - prettyplotlib
    - prettyplotlib

Отредактируйте этот раздел, чтобы удалить пустую строку, перед которой стоит -, а также удалите лишнюю строку prettyplotlib. На момент написания этой статьи я обнаружил, что мне нужно отредактировать большинство таких файлов meta.yaml для внешних пакетов, которые я устанавливаю с помощью conda, что означает, что есть пустая строка импорта, вызывающая ошибку вместе с избыточным импортом данного пакета .

1c) Повторите команду из 1a, которая на этот раз должна завершиться без ошибок. В конце сборки вас спросят, хотите ли вы загрузить сборку в binstar . Я ввел "Нет" и увидел это сообщение:

Если вы хотите загрузить этот пакет на binstar.org позже, введите:

$ binstar загрузить C: \ Anaconda \ conda-bld \ win-64 \ prettyplotlib-0.1.3-py27_0.tar.bz2

Этот файл tar.bz2 - это сборка, которую вам теперь нужно установить.

2) conda install C:\Anaconda\conda-bld\win-64\prettyplotlib-0.1.3-py27_0.tar.bz2

Следуя этим шагам, я успешно использовал conda для установки ряда пакетов, которые не поставляются с Anaconda. Раньше я устанавливал некоторые из них с помощью pip, поэтому я сделалpip uninstall PACKAGE перед установкой PACKAGE с помощью conda. Используя conda, я теперь могу управлять (почти) всеми моими пакетами с помощью единого подхода, вместо того, чтобы устанавливать сочетание компонентов с помощью conda, pip, easy_install и python setup.py install.

Для контекста, я думаю, что эта недавняя запись в блоге @Travis Oliphant будет полезна для таких людей, как я, которые не ценят все, что входит в надежную упаковку Python, но определенно ценят, когда все «просто работает». conda кажется отличным шагом вперед ...

Джош Хеманн
источник
2
Используя conda версии 3.5.2, команда $ conda build --build-recipe XXX; Ошибки с «нераспознанными аргументами: --build-recipe». Полный ответ есть; использование: conda-build [-h] [-c] [--no-binstar-upload] [--output] [-s] [-t] [--no-test] [-V] [-q] RECIPE_PATH [RECIPE_PATH ...] conda-build: ошибка: нераспознанные аргументы: --build-recipe
AnneTheAgile
10

Вот почему я написал Picky: http://picky.readthedocs.io/

Это пакет python, который отслеживает пакеты, установленные с помощью pip или conda в окружениях virtualenvs и conda.

Крис Уизерс
источник
3

Я думаю, что здесь не хватает того, что когда вы делаете:

>pip install .

чтобы установить локальный пакет с помощью setup.py, он устанавливает пакет, видимый для всех окружений conda, использующих одну и ту же версию python. Обратите внимание, что я использую версию pip для conda!

например, если я использую python2.7, он помещает сюда локальный пакет:

/usr/local/anaconda/lib/python2.7/site-packages

Если позже я создам новый conda env с python = 2.7 (= по умолчанию):

>conda create --name new

>source activate new

А затем сделайте:

(new)>conda list    // empty - conda is not aware of any packages yet

Однако если я это сделаю:

(new)>pip list      // the local package installed above is present

Таким образом, в этом случае conda не знает о пакете pip, но пакет доступен для python.

Однако, если я вместо этого установлю локальный пакет (снова используя pip) после того, как я создал (и активировал) новый conda env, теперь conda его увидит:

(new)>conda list   // sees that the package is there and was installed by pip

Поэтому я думаю, что взаимодействие между conda и pip имеет некоторые проблемы - то есть использование pip для установки локального пакета из одного conda env делает этот пакет доступным (но не видимым через список conda) для всех других conda env той же версии python.

MH
источник
2

Обычно я добавляю префикс папки bin / pip для конкретной среды, в которую вы хотите установить пакет, перед командой pip. Например, если вы хотите установить pymc3 в среде py34, вы должны использовать эту команду:

~/anaconda/envs/py34/bin/pip install git+https://github.com/pymc-devs/pymc3 

Вам просто нужно найти правильный путь к папке bin / pip вашей среды и поместить его перед командой установки.

Джанлука
источник
1

Мой which pipпоказывает следующий путь:

$ which pip
/home/kmario23/anaconda3/bin/pip

Итак, какой бы пакет я ни установил, pip install <package-name>он должен быть отражен в списке пакетов при экспорте списка с использованием:

$ conda list --export > conda_list.txt

Но я не знаю. Итак, вместо этого я использовал следующую команду, как было предложено несколькими другими:

# get environment name by
$ conda-env list

# get list of all installed packages by (conda, pip, etc.,)
$ conda-env export -n <my-environment-name> > all_packages.yml
# if you haven't created any specific env, then just use 'root'

Теперь я вижу все пакеты в моем all-packages.ymlфайле.

kmario23
источник
1

Вы можете начать с установки приведенной ниже команды в среде conda:

conda install pip

Затем следует установка всех необходимых пакетов в среде.

После установки всех пакетов conda и pip для экспорта среды используйте:

conda env export -n <env-name> > environment.yml

Это создаст необходимый файл в папке

Кавиш
источник