Как отслеживать пакеты, установленные с помощью 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

Чтобы прояснить это для будущих читателей: в -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


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.



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файле.


1

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

conda install pip

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.