экспортировать среду conda без переменной префикса, которая показывает локальный путь к исполняемому файлу

Чтобы улучшить воспроизводимость в моей команде, я экспортировал файл среды conda во вновь созданный репозиторий, работающий под управлением conda env export > environment.yml.

Идея состоит в том, чтобы мои коллеги скачали репозиторий, запустили conda env create -f environment.yml и были готовы использовать код.

Однако некоторые из моих коллег указали мне, что внизу файла yaml есть:

  - readline=7.0=hc1231fa_4
  - requests=2.18.4=py35h0d65e6b_1
  - setuptools=38.5.1=py35_0
  - six=1.11.0=py35h39a4c60_1
  - sqlite=3.22.0=h3efe00b_0
  - tk=8.6.7=h35a86e2_3
  - urllib3=1.22=py35he002d57_0
  - wheel=0.30.0=py35h5c0b906_1
  - xz=5.2.3=h0278029_2
  - zlib=1.2.11=hf3cbc9b_2
prefix: </path/to/your/anaconda/distribution>/envs/<env-name>/bin

последняя строка с переменной prefix фактически показывает имя моей машины и уникальный путь к установке miniconda.

Когда мои коллеги пытались загрузить окружение, скрипт у них работал нормально, а это значит, что переменная prefix практически игнорируется conda.

Раньше я работал с virtualenvs, и идея о том, что мой абсолютный путь ведет к файлу, который должен быть общим, чтобы сделать вещи воспроизводимыми на разных машинах, действительно сбивает меня с толку.

Итак, мой вопрос: для чего используется префиксная переменная и есть ли способ экспортировать файл среды conda без нее?


person Giacomo    schedule 08.03.2018    source источник


Ответы (1)


Этот вопрос уже обсуждался здесь, но без реального объяснения роли prefix. По крайней мере, есть решение программно исключить префиксную строку.

Он не упоминается в документе conda, кроме факта что conda env export --prefix PATH позволяет указать префикс. Но обратите внимание, что опции --name и --prefix здесь эксклюзивны.

Если вы посмотрите на код conda, вы увидите, что conda create относится к cli_install.check_prefix(). И этот install.py, по-видимому, указывает на то, что — это проверка безопасности имени среды (извлеченного из prefix) и полного пути prefix, чтобы убедиться, что среда с таким же именем или путем не существует.

из conda/cli/install.py

def check_prefix(prefix, json=False):
    name = basename(prefix)
    error = None
    if name == ROOT_ENV_NAME:
        error = "'%s' is a reserved environment name" % name
    if exists(prefix):
        if isdir(prefix) and 'conda-meta' not in os.listdir(prefix):
            return None
        error = "prefix already exists: %s" % prefix

    if error:
        raise CondaValueError(error, json)

    if ' ' in prefix:
        stderrlog.warn("WARNING: A space was detected in your requested environment path\n"
                       "'%s'\n"
"Spaces in paths can sometimes be problematic." % prefix)

Я предполагаю, что это prefix в environment.yaml является частью сложной стратегии, направленной на то, чтобы conda знал, где создавать среду. Но, похоже, в большинстве случаев он бесполезен, и, вероятно, его наличие обусловлено лишь механической связью между --name и --prefix.

из conda.base.context.py Контекст()

# This block of code sets CONDA_PREFIX based on '-n' and '-p' flags, so that
# configuration can be properly loaded from those locations

ИЗМЕНИТЬ:

Тот факт, что prefix даже не упоминается в "создание файла среды вручную» документа conda утешает мысль о том, что эта строка бесполезна...

person FabienP    schedule 08.03.2018
comment
Большое спасибо за объяснение и ссылку на предыдущий ответ. - person Giacomo; 09.03.2018