Отдельно решить, а затем установить среду Conda - PullRequest
2 голосов
/ 27 апреля 2020

Я работаю над задачей, которая включает анализ последней версии каждого пакета в bioconda. Это невозможно сделать с помощью одной большой среды, поскольку решение зависимостей такой большой среды займет несколько дней и может даже не гарантировать наличие последней версии каждого пакета. По этой причине я пытаюсь отдельно установить каждый пакет в своей собственной среде conda.

Чтобы ускорить это, я стараюсь распараллелить как можно большую часть этого. Теперь я знаю, что установки пакетов не могут быть запущены одновременно в conda, потому что каждому процессу требуется разрешение на запись в кэш пакета. Однако мне кажется, что создание и затем решение сред может выполняться одновременно, мне просто нужно установить пакеты последовательно.

Теперь я могу запустить решение параллельно, запустив conda install my_package --json --dry-run > plan.json в каждом процессе, который выводит хороший JSON файл, описывающий решение для каждой среды. Если у меня есть вывод из этого, как я могу сказать conda "установить пакеты, используя этот уже решенный план выполнения"? Я предполагаю что-то вроде conda install --plan plan.json, но такого флага не существует.

Как я могу отделить решение и установку среды conda? Или, может быть, есть другой способ установки большого количества сред conda другим способом?

1 Ответ

2 голосов
/ 27 апреля 2020

По крайней мере, начиная с версии 4.6, Conda представила бета-API для класса Solver . Оказывается, это позволяет вам делать именно то, что мне нужно. Он все еще находится в бета-версии, поэтому с заявлением об отказе от , которое, вероятно, сломается в будущих версиях conda , вы можете сделать это в Conda 4.8.x:

from conda.api import Solver

# Solve the environment, which can be done concurrently
solver = Solver(
    dir, # The location of the conda environment
    ["bioconda", "conda-forge"], # A list of conda channels to use
    specs_to_add=["bwa=0.7.17"], # A list of packages to install
)
transaction = solver.solve_for_transaction()

# This part must be done serially, so use a multiprocessing.Lock here
with lock:
    transaction.download_and_extract()
    transaction.execute()
...