Para mejorar la reproducibilidad en mi equipo, he exportado un archivo de entorno conda en un repositorio recién creado que ejecuta conda env export > environment.yml .
La idea es que mis colegas descarguen el repositorio y ejecuten conda env create -f environment.yml y estén listos para usar el código.
Sin embargo, algunos de mis colegas me señalaron que al final del archivo yaml hay:
- 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 la última línea con la variable de prefix en realidad muestra el nombre de mi máquina y la ruta única a la instalación de miniconda.
Cuando mis colegas intentaron cargar el entorno, la secuencia de comandos realmente funcionó bien para ellos, lo que significa que conda básicamente ignora la variable de prefix .
Solía trabajar con virtualenvs y la idea de que mi ruta absoluta entra en un archivo que se supone que debe compartirse para hacer que las cosas sean reproducibles en diferentes máquinas realmente me confunde.
Entonces, mi pregunta es: ¿para qué se usa la variable de prefijo y hay alguna forma de exportar un archivo de entorno conda sin ella?
Esta pregunta ya se abordó aquí , pero sin una explicación real sobre el papel del prefix . Al menos hay una solución para excluir la línea de prefijo mediante programación.
No se menciona en el documento de conda , excepto por el hecho de que conda env export --prefix PATH permite especificar un prefijo. Pero tenga en cuenta que las opciones --name y --prefix son exclusivas aquí.
Si observa el código de conda , verá que conda create se refiere a cli_install.check_prefix() . Y ese install.py parece indicar que hay una verificación de seguridad en el nombre del entorno (extraído del prefix ) y en la ruta completa del prefix para garantizar que no exista ningún entorno con el mismo nombre o ruta.
de 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)
Supongo que este prefix en environment.yaml es parte de una estrategia compleja para garantizar que conda sepa dónde crear el entorno. Pero parece que es inútil en la mayoría de los casos, y probablemente su presencia solo se deba al vínculo mecánico entre --name y --prefix .
de conda.base.context.py Contexto()
# This block of code sets CONDA_PREFIX based on '-n' and '-p' flags, so that # configuration can be properly loaded from those locations
EDITAR:
El hecho de que el prefix ni siquiera se mencione en la sección " crear un archivo de entorno manualmente " del documento conda es reconfortante con la idea de que esta línea es inútil ...