{"id":570,"date":"2026-07-22T08:17:35","date_gmt":"2026-07-22T08:17:35","guid":{"rendered":"https:\/\/matforge.org\/?p=570","raw":"https:\/\/matforge.org\/?p=570"},"modified":"2026-07-22T08:17:35","modified_gmt":"2026-07-22T08:17:35","slug":"managing-dependencies-scientific-python-lockfiles-environments","status":"publish","type":"post","link":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/","title":{"rendered":"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad","raw":"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>La gesti\u00f3n de las dependencias en Python cient\u00edfico es una de las partes m\u00e1s importantes de la investigaci\u00f3n reproducible. Una simulaci\u00f3n puede fallar meses despu\u00e9s porque cambiaron las versiones de paquetes, se cambi\u00f3 un int\u00e9rprete de Python o una biblioteca num\u00e9rica actualizada de manera que afecte a los resultados.<\/p>\n<p>Esta gu\u00eda explica c\u00f3mo los archivos de bloqueo, los entornos y los administradores de paquetes modernos ayudan a los investigadores a mantener los flujos de trabajo cient\u00edficos de Python reproducibles, port\u00e1tiles y m\u00e1s f\u00e1ciles de mantener.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li>Los archivos de bloqueo son uno de los pasos m\u00e1s impactantes para los flujos de trabajo cient\u00edficos de Python reproducibles.<\/li>\n<li><code>uv<\/code> es un administrador de paquetes moderno y r\u00e1pido y se usa cada vez m\u00e1s como una alternativa a PIP, PIP-tools y poes\u00eda.<\/li>\n<li>PEP 751 introduce un formato de archivo de bloqueo estandarizado, <code>pylock.toml<\/code>, para reducir la fragmentaci\u00f3n de la herramienta.<\/li>\n<li>Conda sigue siendo importante para proyectos cient\u00edficos de Python con dependencias que no son de Python como C, C++, MPI, HDF5 y CUDA.<\/li>\n<li>Su elecci\u00f3n de herramienta debe coincidir con su flujo de trabajo: <code>uv<\/code> para velocidad y reproducibilidad, conda para pilas cient\u00edficas y de HPC y poes\u00eda para canalizaciones de publicaci\u00f3n madura.<\/li>\n<\/ul>\n<h2>El modo de falla oculta en Scientific Python<\/h2>\n<p>Cada investigador de computaci\u00f3n cient\u00edfica eventualmente ve el mismo problema. Una simulaci\u00f3n funcion\u00f3 el mes pasado, pero ahora falla con una discrepancia de versi\u00f3n. Peor a\u00fan, puede que a\u00fan se ejecute, pero produzca resultados sutilmente diferentes.<\/p>\n<p>Esto no es solo un inconveniente. Es un fracaso de reproducibilidad. El entorno computacional cambi\u00f3, incluidas las versiones de paquetes, los int\u00e9rpretes de Python o las dependencias de nivel inferior. Su c\u00f3digo se rompi\u00f3 o produjo resultados silenciosos que ya no son equivalentes a la ejecuci\u00f3n original.<\/p>\n<p>La causa ra\u00edz generalmente son las dependencias no ancladas. Incluso cuando el c\u00f3digo est\u00e1 controlado por versiones, el trabajo permanece vinculado a una m\u00e1quina espec\u00edfica y en un momento dado si el entorno no es reproducible.<\/p>\n<p>Python cient\u00edfico hace que este problema sea especialmente serio. A diferencia de muchos proyectos web, la inform\u00e1tica cient\u00edfica a menudo depende de cadenas complejas de bibliotecas num\u00e9ricas, paquetes compilados y compilaciones sensibles al hardware. Numpy, Scipy, Fipy, HDF5, MPI, OpenBLA y versiones espec\u00edficas de Python deben trabajar juntas.<\/p>\n<p>La soluci\u00f3n es gestionar las dependencias deliberadamente. Utilice Lockfiles para congelar versiones exactas, realizar un seguimiento de los entornos en el control de versiones y documentar c\u00f3mo se debe volver a crear el entorno.<\/p>\n<h2>\u00bfQu\u00e9 es un archivo de bloqueo?<\/h2>\n<p>Un archivo de bloqueo es una instant\u00e1nea del entorno de software exacto de un proyecto. Registra las versiones espec\u00edficas de todas las dependencias, incluidas las subdependencias, que se instalaron la \u00faltima vez que se configur\u00f3 el proyecto.<\/p>\n<p>Piense en ello como una receta congelada para su configuraci\u00f3n de software. Cualquiera puede volver a crear el mismo entorno m\u00e1s tarde, incluso si las versiones de paquetes han cambiado ascendente.<\/p>\n<h3>sin archivos de bloqueo<\/h3>\n<pre><code class=\"language-bash\"># requirements.txt without a lockfile\nnumpy&gt;=1.25.0\nscipy&gt;=1.11.0\nfipy&gt;=4.3.0\n\n# On another machine or after a month:\npip install -r requirements.txt\n\n# This might install newer versions:\n# numpy 1.26.x, scipy 1.12.x, or different dependency builds\n<\/code><\/pre>\n<p>Este tipo de configuraci\u00f3n permite que las versiones de paquetes cambien. El c\u00f3digo a\u00fan puede ejecutarse, pero pueden cambiar el comportamiento num\u00e9rico, la precisi\u00f3n, el comportamiento del solucionador o las internas de dependencia.<\/p>\n<h3>con archivos de bloqueo<\/h3>\n<pre><code class=\"language-bash\"># uv.lock or another lockfile records exact resolved versions\n\nuv sync\n\n# Anyone who runs the sync command gets the same resolved environment\n<\/code><\/pre>\n<p>Esto es importante para los proyectos de simulaci\u00f3n porque las bibliotecas num\u00e9ricas pueden cambiar las rutas de c\u00f3digo en todas las versiones. El comportamiento de punto flotante puede diferir entre las compilaciones. Los solucionadores de PDE y los marcos cient\u00edficos tambi\u00e9n pueden comportarse de manera diferente entre los lanzamientos.<\/p>\n<p>Un archivo de bloqueo reduce esta incertidumbre al hacer que la instalaci\u00f3n sea determinista.<\/p>\n<h2>El panorama de gesti\u00f3n de dependencias de Python<\/h2>\n<p>El ecosistema de Python tiene varias opciones pr\u00e1cticas de gesti\u00f3n de dependencias. Cada herramienta tiene diferentes fortalezas, y la elecci\u00f3n correcta depende de si el proyecto es Python puro, centrado en HPC, orientado a paquetes o construido para reproducirse a largo plazo.<\/p>\n<h3>UV: la opci\u00f3n r\u00e1pida y moderna<\/h3>\n<p><code>uv<\/code> es un administrador de paquetes basado en \u00f3xido construido por Astral. Su objetivo es reemplazar varias herramientas comunes de Python, incluidas PIP, PIP-Tools, PiPX, PYENV y virtualenv, con un solo flujo de trabajo r\u00e1pido.<\/p>\n<p>Los investigadores est\u00e1n cambiando a <code>uv<\/code> por varias razones:<\/p>\n<ol>\n<li>velocidad. <code>uv<\/code> puede instalar paquetes mucho m\u00e1s r\u00e1pido que los flujos de trabajo basados en PIP tradicionales, especialmente con el almacenamiento en cach\u00e9.<\/li>\n<li>Archivo de bloqueo universal. Un solo <code>uv.lock<\/code> puede admitir instalaciones reproducibles en todas las plataformas.<\/li>\n<li>Compatibilidad de PIP. Los comandos como <code>uv pip install<\/code> facilitan la migraci\u00f3n.<\/li>\n<li>Gesti\u00f3n de versiones de Python. <code>uv<\/code> Puede instalar y administrar int\u00e9rpretes de Python, lo que reduce la necesidad de herramientas separadas.<\/li>\n<li>Instalaci\u00f3n independiente. <code>uv<\/code> no requiere que Python se instale primero.<\/li>\n<\/ol>\n<p>Use <code>uv<\/code> para nuevos proyectos donde la velocidad, la reproducibilidad y la simple migraci\u00f3n de PIP Matter.<\/p>\n<p>Es especialmente \u00fatil para:<\/p>\n<ul>\n<li>Nuevos proyectos de simulaci\u00f3n.<\/li>\n<li>Tuber\u00edas CI\/CD donde el tiempo de instalaci\u00f3n es importante.<\/li>\n<li>Proyectos que necesitan gesti\u00f3n de dependencias y gesti\u00f3n de versiones de Python juntos.<\/li>\n<li>Equipos que migran de PIP o PIP-Tools.<\/li>\n<\/ul>\n<h4>Flujo de trabajo UV b\u00e1sico<\/h4>\n<pre><code class=\"language-bash\"># Install uv\ncurl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh\n\n# Create a new project with Python 3.11\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add dependencies\nuv add numpy scipy fipy\n\n# Generate a lockfile\nuv lock\n\n# Sync to install from the lockfile\nuv sync\n<\/code><\/pre>\n<p>La principal compensaci\u00f3n es que la poes\u00eda todav\u00eda tiene flujos de trabajo de publicaci\u00f3n maduros y manejo avanzado de grupos de dependencias. Si mantiene un paquete cient\u00edfico de Python para PYPI, la poes\u00eda puede seguir siendo atractiva.<\/p>\n<h3>Poes\u00eda: el director de proyecto establecido<\/h3>\n<p>La poes\u00eda es una herramienta completa de gesti\u00f3n de proyectos. Maneja la resoluci\u00f3n de dependencias, los entornos virtuales, la creaci\u00f3n de paquetes y la publicaci\u00f3n en PYPI.<\/p>\n<p>Los investigadores todav\u00eda eligen la poes\u00eda por varias razones:<\/p>\n<ol>\n<li>grupos de dependencias. La poes\u00eda puede separar el desarrollo, las pruebas, la documentaci\u00f3n y las dependencias de CI limpiamente.<\/li>\n<li>Flujo de trabajo de publicaci\u00f3n. Tiene soporte integrado para construir y publicar paquetes.<\/li>\n<li>ecosistema maduro. La poes\u00eda tiene a\u00f1os de uso de la producci\u00f3n, amplia documentaci\u00f3n y una gran comunidad.<\/li>\n<\/ol>\n<p>Usa la poes\u00eda cuando:<\/p>\n<ul>\n<li>Publica un paquete de Python en PYPI.<\/li>\n<li>Necesita una gesti\u00f3n de grupos de dependencias madura.<\/li>\n<li>Su equipo valora un largo historial y una documentaci\u00f3n establecida.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es la velocidad. La poes\u00eda puede tardar m\u00e1s de <code>uv<\/code> para las instalaciones en fr\u00edo, la generaci\u00f3n de archivos de bloqueo y las adiciones de paquetes. Para proyectos peque\u00f1os, esto puede no importar. Para proyectos grandes y canalizaciones de CI, la diferencia puede volverse notable.<\/p>\n<h3>Conda: el elemento cient\u00edfico<\/h3>\n<p>Conda sigue siendo una de las herramientas m\u00e1s importantes para Python cient\u00edfico, especialmente cuando el proyecto necesita dependencias que no sean de Python.<\/p>\n<p>Conda es \u00fatil para la investigaci\u00f3n porque puede administrar paquetes de Python, paquetes R, bibliotecas compiladas, compiladores, MPI, HDF5, CUDA y otras dependencias a nivel de sistema en un entorno.<\/p>\n<p>Conda es importante cuando:<\/p>\n<ul>\n<li>Necesita dependencias que no sean de Python como C, C++, MPI, HDF5, FFTW o CUDA.<\/li>\n<li>Se dirige a cl\u00fasteres de HPC.<\/li>\n<li>Sus bibliotecas cient\u00edficas dependen de un c\u00f3digo C o FORTRAN compilado.<\/li>\n<li>Trabajas en Python y R.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es que la conda puede ser m\u00e1s lenta que <code>uv<\/code> para la resoluci\u00f3n de la dependencia de Python pura y puede que no produzca archivos de bloqueo universales multiplataforma con la misma facilidad.<\/p>\n<h4>Flujo de trabajo b\u00e1sico de la CONDA<\/h4>\n<pre><code class=\"language-bash\"># Create environment\nconda create -n my-sim python=3.11\nconda activate my-sim\n\n# Install packages, including non-Python dependencies\nconda install numpy scipy hdf5 openmpi\n\n# Export to environment file\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n\n# Restore the environment\nconda env create -f environment.yml\n<\/code><\/pre>\n<h3>Pip-Tools: la opci\u00f3n minimalista<\/h3>\n<p><code>pip-tools<\/code> Puente los flujos de trabajo de PIP tradicionales y los archivos de bloqueo. Es ligero y permanece cerca de la interfaz PIP.<\/p>\n<p>Use herramientas PIP cuando:<\/p>\n<ul>\n<li>Quieres un enfoque simple.<\/li>\n<li>Est\u00e1s migrando desde PIP y no quieres aprender una herramienta m\u00e1s grande.<\/li>\n<li>Su proyecto es peque\u00f1o y no necesita grupos de dependencias avanzados.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es que las herramientas pip pueden generar archivos de salida espec\u00edficos de la plataforma. Tambi\u00e9n es menos completo que la poes\u00eda o <code>uv<\/code>.<\/p>\n<h2>PEP 751: El futuro de los archivos de bloqueo<\/h2>\n<p>PEP 751 propone un formato de archivo estandarizado para grabar dependencias de Python para que los entornos puedan instalarse de forma reproducible. Este formato se llama <code>pylock.toml<\/code>.<\/p>\n<h3>lo que resuelve<\/h3>\n<p>Las herramientas de dependencia de Python han utilizado hist\u00f3ricamente diferentes formatos de archivo de bloqueo. PDM, PIP Freeze, PIP-tools, poes\u00eda y <code>uv<\/code> todos los entornos de enfoque se bloquean de manera diferente.<\/p>\n<p>Esto crea varios problemas:<\/p>\n<ul>\n<li>Bloqueo de vendedor. Puede ser dif\u00edcil cambiar entre herramientas.<\/li>\n<li>Fragmentaci\u00f3n de herramientas. Los esc\u00e1neres de seguridad y las herramientas de automatizaci\u00f3n pueden admitir solo algunos formatos.<\/li>\n<li>Dificultad de auditor\u00eda. Los diferentes formatos tienen diferentes sintaxis y convenciones.<\/li>\n<\/ul>\n<p>PEP 751 propone <code>pylock.toml<\/code> como un formato estandarizado.<\/p>\n<h3>Por qu\u00e9 es importante para Python cient\u00edfico<\/h3>\n<p>El formato propuesto es \u00fatil para la investigaci\u00f3n porque es:<\/p>\n<ul>\n<li>Legible por humanos, usando TOML.<\/li>\n<li>generado por m\u00e1quina, por lo que las herramientas pueden escribir una salida consistente.<\/li>\n<li>consumible por herramientas que no son de Python.<\/li>\n<li>Seguro por dise\u00f1o, con hashes criptogr\u00e1ficos para la protecci\u00f3n de la cadena de suministro.<\/li>\n<li>Lo suficientemente flexible como para representar m\u00faltiples entornos o grupos de dependencias.<\/li>\n<\/ul>\n<p>Una vez que se adopta ampliamente, <code>pylock.toml<\/code> puede reducir la necesidad de formatos de archivo de bloqueo espec\u00edficos de la herramienta. Para los investigadores, esto significa una mejor interoperabilidad. Un archivo de bloqueo podr\u00eda ser consumido por cualquier herramienta compatible y auditado m\u00e1s f\u00e1cilmente por servicios externos.<\/p>\n<h2>El espectro de reproducibilidad<\/h2>\n<p>La reproducibilidad es un espectro. El nivel correcto depende del riesgo, la duraci\u00f3n del proyecto y los requisitos de publicaci\u00f3n.<\/p>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Nivel<\/th>\n<th>Enfoque<\/th>\n<th>Costo<\/th>\n<th>reproducibilidad<\/th>\n<th>mejor para<\/th>\n<\/tr>\n<tr>\n<td>Bueno<\/td>\n<td>Dependencias de documentos en L\u00e9ame<\/td>\n<td>M\u00ednimo<\/td>\n<td>verificaci\u00f3n manual<\/td>\n<td>Scripts y tutoriales r\u00e1pidos<\/td>\n<\/tr>\n<tr>\n<td>Mejor<\/td>\n<td>Archivo de entorno como <code>requirements.txt<\/code> o <code>environment.yml<\/code><\/td>\n<td>Bajo<\/td>\n<td>Instalaci\u00f3n automatizada<\/td>\n<td>Proyectos compartidos y colaboradores<\/td>\n<\/tr>\n<tr>\n<td>Mejor<\/td>\n<td>Entorno Lockfile Plus controlado por versiones<\/td>\n<td>Moderar<\/td>\n<td>reproducci\u00f3n exacta<\/td>\n<td>Publicaciones y archivos a largo plazo<\/td>\n<\/tr>\n<tr>\n<td>M\u00e1ximo<\/td>\n<td>Contenedorizaci\u00f3n con Docker o Singularidad<\/td>\n<td>Elevado<\/td>\n<td>Aislamiento fuerte<\/td>\n<td>HPC y flujos de trabajo publicados<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para proyectos de investigaci\u00f3n, el m\u00ednimo es fijar versiones exactas en <code>requirements.txt<\/code> o <code>environment.yml<\/code>. El enfoque recomendado es utilizar <code>uv lock<\/code> o exportaci\u00f3n de conda para generar un archivo de entorno reproducible. La mejor pr\u00e1ctica es rastrear ese archivo en Git y documentar c\u00f3mo recrear el entorno en el archivo L\u00e9ame.<\/p>\n<h2>Flujos de trabajo pr\u00e1cticos para proyectos cient\u00edficos<\/h2>\n<h3>Flujo de trabajo 1: Nuevo proyecto de simulaci\u00f3n con UV<\/h3>\n<pre><code class=\"language-bash\"># Initialize project\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add core dependencies\nuv add numpy scipy matplotlib\n\n# Add scientific libraries\nuv add fipy mpmath\n\n# Generate lockfile\nuv lock\n\n# Add dev dependencies\nuv add --group dev pytest black ruff\n\n# Commit everything\ngit add pyproject.toml uv.lock\ngit commit -m \"Initial project structure with pinned dependencies\"\n<\/code><\/pre>\n<p>Esto funciona porque el archivo <code>uv.lock<\/code> est\u00e1 comprometido con git. Cualquiera que clone el repositorio y ejecute <code>uv sync<\/code> obtiene las mismas versiones resueltas.<\/p>\n<h3>Flujo de trabajo 2: Proyecto HPC con Conda y Singularidad<\/h3>\n<pre><code class=\"language-bash\"># On your workstation\nconda create -n hpc-sim python=3.11\nconda activate hpc-sim\nconda install numpy scipy hdf5 openmpi\n\n# Export environment\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n\n# Build Singularity image from Docker\ndocker build -t my-sim:latest .\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n\n# Transfer to HPC cluster\nscp my-sim.sif hpc-cluster:\/scratch\/\n<\/code><\/pre>\n<p>Esto funciona porque Conda administra las dependencias de la estaci\u00f3n de trabajo, mientras que Singularity proporciona una contenedorizaci\u00f3n compatible con HPC. El archivo <code>environment.yml<\/code> se puede controlar y volver a crear en otro sistema.<\/p>\n<h3>Flujo de trabajo 3: migraci\u00f3n de PIP a UV<\/h3>\n<pre><code class=\"language-bash\"># Start with existing requirements.txt\npip install uv\n\n# Replace pip with uv for installs\nuv pip install -r requirements.txt\n\n# Generate a uv lockfile\nuv lock\n\n# From now on, use uv sync instead of pip install\nuv sync\n<\/code><\/pre>\n<p>Esta ruta de migraci\u00f3n es simple porque <code>uv<\/code> es compatible con muchos flujos de trabajo de estilo PIP. El archivo <code>uv.lock<\/code> se convierte en la \u00fanica fuente de verdad para el entorno.<\/p>\n<h2>Errores comunes y c\u00f3mo evitarlos<\/h2>\n<h3>Error 1: Uso de dependencias no ancladas<\/h3>\n<pre><code class=\"language-python\"># WRONG: Allows automatic updates\nnumpy&gt;=1.0\nscipy&gt;=1.0\n\n# RIGHT: Pin exact versions\nnumpy==1.26.4\nscipy==1.11.4\n<\/code><\/pre>\n<p>Los cambios de versi\u00f3n menores pueden alterar el comportamiento num\u00e9rico, los criterios de convergencia o la precisi\u00f3n del punto flotante. Fija las versiones exactas cuando la reproducibilidad importa.<\/p>\n<h3>Error 2: no cometer ning\u00fan archivo de bloqueo<\/h3>\n<p>Si su repositorio contiene <code>pyproject.toml<\/code> pero no lockfile, su proyecto no es totalmente reproducible. Un archivo de bloqueo es el requisito m\u00ednimo para las compilaciones deterministas.<\/p>\n<p>Genere un archivo de bloqueo y confirme:<\/p>\n<pre><code class=\"language-bash\">uv lock  # or conda export\ngit add uv.lock  # or environment.yml\ngit commit -m \"Add lockfile for reproducible environment\"\n<\/code><\/pre>\n<h3>Error 3: ignorar las subdependencias<\/h3>\n<p>Incluso si fija paquetes de nivel superior, las subdependencias a\u00fan pueden cambiar el comportamiento.<\/p>\n<pre><code class=\"language-python\"># If you pin fipy but not its dependencies:\n# numpy, mpmath, and other packages may upgrade independently\n<\/code><\/pre>\n<p>Utilice una herramienta que resuelva y ancla el \u00e1rbol de dependencia completo, como <code>uv<\/code>, Conda o Poes\u00eda.<\/p>\n<h3>Error 4: entornos espec\u00edficos de la plataforma<\/h3>\n<p>Algunas herramientas pueden generar una salida espec\u00edfica de la plataforma. Si desarrolla en macOS pero implementa en Linux, los archivos de entorno pueden fallar o resolver de manera diferente.<\/p>\n<p>Utilice herramientas que admitan archivos de bloqueo multiplataforma o generen archivos de bloqueo en la plataforma de destino.<\/p>\n<h3>Error 5: Dependencias de datos externas<\/h3>\n<p>Si una simulaci\u00f3n depende de API externas o de bases de datos que cambian, la reproducibilidad puede romperse incluso cuando el entorno de Python est\u00e1 bloqueado.<\/p>\n<p>Snapshot datos externos cuando sea posible. Si eso no es posible, utilice puntos de enlace de API versionados y documente la versi\u00f3n exacta o la fecha de acceso.<\/p>\n<h2>Lo que recomendamos: Un marco de decisi\u00f3n<\/h2>\n<p>Utilice este marco de decisi\u00f3n al elegir una herramienta de gesti\u00f3n de dependencias para un proyecto cient\u00edfico de Python.<\/p>\n<ol>\n<li>\n<p>\u00bfNecesita dependencias que no son de Python como C, C++, MPI, CUDA, HDF5 o FFTW?<\/p>\n<ul>\n<li>S\u00ed: use Conda, o use Conda dentro de Docker o Singularity.<\/li>\n<li>No: Contin\u00fae con la siguiente pregunta.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfEst\u00e1s publicando un paquete de Python en PYPI?<\/p>\n<ul>\n<li>S\u00ed: Considere la poes\u00eda para los flujos de trabajo de publicaci\u00f3n maduros o <code>uv<\/code> para la velocidad.<\/li>\n<li>No: Contin\u00fae con la siguiente pregunta.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfEst\u00e1s trabajando en canalizaciones CI\/CD?<\/p>\n<ul>\n<li>S\u00ed: use <code>uv<\/code> porque las instalaciones m\u00e1s r\u00e1pidas pueden reducir el tiempo de CI.<\/li>\n<li>No: O <code>uv<\/code>, Conda o poes\u00eda pueden funcionar dependiendo del proyecto.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfQu\u00e9 tan importante es la compatibilidad multiplataforma?<\/p>\n<ul>\n<li>Alto: use <code>uv<\/code> donde un archivo de bloqueo universal se ajuste a sus necesidades.<\/li>\n<li>Moderado: Conda puede funcionar bien, especialmente en sistemas de investigaci\u00f3n tipo UNIX.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Para la mayor\u00eda de los nuevos proyectos de investigaci\u00f3n, <code>uv<\/code> es un valor predeterminado fuerte cuando necesita velocidad y reproducibilidad. Para proyectos de HPC o flujos de trabajo con dependencias que no son de Python, empareja conda con la contenedorizaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>La gesti\u00f3n de dependencias en Scientific Python no es opcional. Es una base de investigaci\u00f3n reproducible.<\/p>\n<p>Los puntos m\u00e1s importantes son:<\/p>\n<ol>\n<li>Los archivos de bloqueo son esenciales. Fija las versiones exactas y s\u00edguelas en Git.<\/li>\n<li><code>uv<\/code> es una opci\u00f3n moderna y fuerte para entornos r\u00e1pidos y reproducibles.<\/li>\n<li>Conda sigue siendo vital para las pilas cient\u00edficas con dependencias que no son de Python.<\/li>\n<li>PEP 751 tiene como objetivo unificar los formatos de archivo de bloqueo a trav\u00e9s de <code>pylock.toml<\/code>.<\/li>\n<li>Un README con instrucciones de instalaci\u00f3n claras es la documentaci\u00f3n m\u00ednima que necesita todo proyecto.<\/li>\n<\/ol>\n<p>Comience por auditar los proyectos actuales. Compruebe si los entornos est\u00e1n documentados y las dependencias est\u00e1n ancladas. Convierta un proyecto para usar un archivo de bloqueo. El costo inicial vale la pena cuando usted u otro investigador necesita volver a ejecutar la simulaci\u00f3n meses o a\u00f1os despu\u00e9s con confianza.<\/p>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/\">Flujos de trabajo de investigaci\u00f3n reproducibles: Docker y Conda para proyectos de simulaci\u00f3n<\/a> \u2014 Aprenda c\u00f3mo Docker y Conda se complementan entre s\u00ed para la reproducibilidad de la simulaci\u00f3n.<\/li>\n<li><a href=\"https:\/\/matforge.org\/unit-testing-scientific-code-pytest-strategies-research-projects\/\">pruebas unitarias de c\u00f3digo cient\u00edfico: estrategias pytest para proyectos de investigaci\u00f3n<\/a> \u2014 patrones de CI para reproducir Tuber\u00edas de simulaci\u00f3n.<\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Aceleraci\u00f3n de GPU para simulaciones FIPY: integraci\u00f3n de CUPY y NUMBA Gu\u00eda<\/a> \u2014 Gestione las dependencias de GPU con PYPI y Conda.<\/li>\n<li><a href=\"https:\/\/matforge.org\/working-through-your-first-fipy-example\/\">trabajando a trav\u00e9s de su primer ejemplo de fipy<\/a>: comience con un proyecto fipy administrado por dependencias.<\/li>\n<\/ul>\n<h2>Referencias y lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.astral.sh\/uv\/\">documentaci\u00f3n uv<\/a> \u2014 Gu\u00eda oficial para el administrador de paquetes basado en \u00f3xido.<\/li>\n<li><a href=\"https:\/\/peps.python.org\/pep-0751\/\">PEP 751: Especificaci\u00f3n de Pylock.toml<\/a> \u2014 propuesta de formato de archivo de bloqueo estandarizado.<\/li>\n<li><a href=\"https:\/\/book.the-turing-way.org\/reproducible-research\/overview\/overview-definitions\/\">The Turing Way: Definiciones de investigaci\u00f3n reproducibles<\/a> \u2014 Normas comunitarias para flujos de trabajo reproducibles.<\/li>\n<li><a href=\"https:\/\/lincolnloop.github.io\/python-package-manager-shootout\/\">Python Package Manager Shootout<\/a> \u2014 Comparaci\u00f3n de referencias UV, poes\u00eda, pip-tools, PDM y PIXI.<\/li>\n<li><a href=\"https:\/\/wagtail.org\/blog\/uv-overtakes-poetry\/\">wagtail: UV supera la poes\u00eda<\/a> \u2014 Se\u00f1al de adopci\u00f3n de la industria.<\/li>\n<\/ul>\n","protected":false,"raw":"<p>La gesti\u00f3n de las dependencias en Python cient\u00edfico es una de las partes m\u00e1s importantes de la investigaci\u00f3n reproducible. Una simulaci\u00f3n puede fallar meses despu\u00e9s porque cambiaron las versiones de paquetes, se cambi\u00f3 un int\u00e9rprete de Python o una biblioteca num\u00e9rica actualizada de manera que afecte a los resultados.<\/p>\n<p>Esta gu\u00eda explica c\u00f3mo los archivos de bloqueo, los entornos y los administradores de paquetes modernos ayudan a los investigadores a mantener los flujos de trabajo cient\u00edficos de Python reproducibles, port\u00e1tiles y m\u00e1s f\u00e1ciles de mantener.<\/p>\n<h2>Comida clave<\/h2>\n<ul>\n<li>Los archivos de bloqueo son uno de los pasos m\u00e1s impactantes para los flujos de trabajo cient\u00edficos de Python reproducibles.<\/li>\n<li><code>uv<\/code> es un administrador de paquetes moderno y r\u00e1pido y se usa cada vez m\u00e1s como una alternativa a PIP, PIP-tools y poes\u00eda.<\/li>\n<li>PEP 751 introduce un formato de archivo de bloqueo estandarizado, <code>pylock.toml<\/code>, para reducir la fragmentaci\u00f3n de la herramienta.<\/li>\n<li>Conda sigue siendo importante para proyectos cient\u00edficos de Python con dependencias que no son de Python como C, C++, MPI, HDF5 y CUDA.<\/li>\n<li>Su elecci\u00f3n de herramienta debe coincidir con su flujo de trabajo: <code>uv<\/code> para velocidad y reproducibilidad, conda para pilas cient\u00edficas y de HPC y poes\u00eda para canalizaciones de publicaci\u00f3n madura.<\/li>\n<\/ul>\n<h2>El modo de falla oculta en Scientific Python<\/h2>\n<p>Cada investigador de computaci\u00f3n cient\u00edfica eventualmente ve el mismo problema. Una simulaci\u00f3n funcion\u00f3 el mes pasado, pero ahora falla con una discrepancia de versi\u00f3n. Peor a\u00fan, puede que a\u00fan se ejecute, pero produzca resultados sutilmente diferentes.<\/p>\n<p>Esto no es solo un inconveniente. Es un fracaso de reproducibilidad. El entorno computacional cambi\u00f3, incluidas las versiones de paquetes, los int\u00e9rpretes de Python o las dependencias de nivel inferior. Su c\u00f3digo se rompi\u00f3 o produjo resultados silenciosos que ya no son equivalentes a la ejecuci\u00f3n original.<\/p>\n<p>La causa ra\u00edz generalmente son las dependencias no ancladas. Incluso cuando el c\u00f3digo est\u00e1 controlado por versiones, el trabajo permanece vinculado a una m\u00e1quina espec\u00edfica y en un momento dado si el entorno no es reproducible.<\/p>\n<p>Python cient\u00edfico hace que este problema sea especialmente serio. A diferencia de muchos proyectos web, la inform\u00e1tica cient\u00edfica a menudo depende de cadenas complejas de bibliotecas num\u00e9ricas, paquetes compilados y compilaciones sensibles al hardware. Numpy, Scipy, Fipy, HDF5, MPI, OpenBLA y versiones espec\u00edficas de Python deben trabajar juntas.<\/p>\n<p>La soluci\u00f3n es gestionar las dependencias deliberadamente. Utilice Lockfiles para congelar versiones exactas, realizar un seguimiento de los entornos en el control de versiones y documentar c\u00f3mo se debe volver a crear el entorno.<\/p>\n<h2>\u00bfQu\u00e9 es un archivo de bloqueo?<\/h2>\n<p>Un archivo de bloqueo es una instant\u00e1nea del entorno de software exacto de un proyecto. Registra las versiones espec\u00edficas de todas las dependencias, incluidas las subdependencias, que se instalaron la \u00faltima vez que se configur\u00f3 el proyecto.<\/p>\n<p>Piense en ello como una receta congelada para su configuraci\u00f3n de software. Cualquiera puede volver a crear el mismo entorno m\u00e1s tarde, incluso si las versiones de paquetes han cambiado ascendente.<\/p>\n<h3>sin archivos de bloqueo<\/h3>\n<pre><code class=\"language-bash\"># requirements.txt without a lockfile\nnumpy&gt;=1.25.0\nscipy&gt;=1.11.0\nfipy&gt;=4.3.0\n\n# On another machine or after a month:\npip install -r requirements.txt\n\n# This might install newer versions:\n# numpy 1.26.x, scipy 1.12.x, or different dependency builds\n<\/code><\/pre>\n<p>Este tipo de configuraci\u00f3n permite que las versiones de paquetes cambien. El c\u00f3digo a\u00fan puede ejecutarse, pero pueden cambiar el comportamiento num\u00e9rico, la precisi\u00f3n, el comportamiento del solucionador o las internas de dependencia.<\/p>\n<h3>con archivos de bloqueo<\/h3>\n<pre><code class=\"language-bash\"># uv.lock or another lockfile records exact resolved versions\n\nuv sync\n\n# Anyone who runs the sync command gets the same resolved environment\n<\/code><\/pre>\n<p>Esto es importante para los proyectos de simulaci\u00f3n porque las bibliotecas num\u00e9ricas pueden cambiar las rutas de c\u00f3digo en todas las versiones. El comportamiento de punto flotante puede diferir entre las compilaciones. Los solucionadores de PDE y los marcos cient\u00edficos tambi\u00e9n pueden comportarse de manera diferente entre los lanzamientos.<\/p>\n<p>Un archivo de bloqueo reduce esta incertidumbre al hacer que la instalaci\u00f3n sea determinista.<\/p>\n<h2>El panorama de gesti\u00f3n de dependencias de Python<\/h2>\n<p>El ecosistema de Python tiene varias opciones pr\u00e1cticas de gesti\u00f3n de dependencias. Cada herramienta tiene diferentes fortalezas, y la elecci\u00f3n correcta depende de si el proyecto es Python puro, centrado en HPC, orientado a paquetes o construido para reproducirse a largo plazo.<\/p>\n<h3>UV: la opci\u00f3n r\u00e1pida y moderna<\/h3>\n<p><code>uv<\/code> es un administrador de paquetes basado en \u00f3xido construido por Astral. Su objetivo es reemplazar varias herramientas comunes de Python, incluidas PIP, PIP-Tools, PiPX, PYENV y virtualenv, con un solo flujo de trabajo r\u00e1pido.<\/p>\n<p>Los investigadores est\u00e1n cambiando a <code>uv<\/code> por varias razones:<\/p>\n<ol>\n<li>velocidad. <code>uv<\/code> puede instalar paquetes mucho m\u00e1s r\u00e1pido que los flujos de trabajo basados en PIP tradicionales, especialmente con el almacenamiento en cach\u00e9.<\/li>\n<li>Archivo de bloqueo universal. Un solo <code>uv.lock<\/code> puede admitir instalaciones reproducibles en todas las plataformas.<\/li>\n<li>Compatibilidad de PIP. Los comandos como <code>uv pip install<\/code> facilitan la migraci\u00f3n.<\/li>\n<li>Gesti\u00f3n de versiones de Python. <code>uv<\/code> Puede instalar y administrar int\u00e9rpretes de Python, lo que reduce la necesidad de herramientas separadas.<\/li>\n<li>Instalaci\u00f3n independiente. <code>uv<\/code> no requiere que Python se instale primero.<\/li>\n<\/ol>\n<p>Use <code>uv<\/code> para nuevos proyectos donde la velocidad, la reproducibilidad y la simple migraci\u00f3n de PIP Matter.<\/p>\n<p>Es especialmente \u00fatil para:<\/p>\n<ul>\n<li>Nuevos proyectos de simulaci\u00f3n.<\/li>\n<li>Tuber\u00edas CI\/CD donde el tiempo de instalaci\u00f3n es importante.<\/li>\n<li>Proyectos que necesitan gesti\u00f3n de dependencias y gesti\u00f3n de versiones de Python juntos.<\/li>\n<li>Equipos que migran de PIP o PIP-Tools.<\/li>\n<\/ul>\n<h4>Flujo de trabajo UV b\u00e1sico<\/h4>\n<pre><code class=\"language-bash\"># Install uv\ncurl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh\n\n# Create a new project with Python 3.11\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add dependencies\nuv add numpy scipy fipy\n\n# Generate a lockfile\nuv lock\n\n# Sync to install from the lockfile\nuv sync\n<\/code><\/pre>\n<p>La principal compensaci\u00f3n es que la poes\u00eda todav\u00eda tiene flujos de trabajo de publicaci\u00f3n maduros y manejo avanzado de grupos de dependencias. Si mantiene un paquete cient\u00edfico de Python para PYPI, la poes\u00eda puede seguir siendo atractiva.<\/p>\n<h3>Poes\u00eda: el director de proyecto establecido<\/h3>\n<p>La poes\u00eda es una herramienta completa de gesti\u00f3n de proyectos. Maneja la resoluci\u00f3n de dependencias, los entornos virtuales, la creaci\u00f3n de paquetes y la publicaci\u00f3n en PYPI.<\/p>\n<p>Los investigadores todav\u00eda eligen la poes\u00eda por varias razones:<\/p>\n<ol>\n<li>grupos de dependencias. La poes\u00eda puede separar el desarrollo, las pruebas, la documentaci\u00f3n y las dependencias de CI limpiamente.<\/li>\n<li>Flujo de trabajo de publicaci\u00f3n. Tiene soporte integrado para construir y publicar paquetes.<\/li>\n<li>ecosistema maduro. La poes\u00eda tiene a\u00f1os de uso de la producci\u00f3n, amplia documentaci\u00f3n y una gran comunidad.<\/li>\n<\/ol>\n<p>Usa la poes\u00eda cuando:<\/p>\n<ul>\n<li>Publica un paquete de Python en PYPI.<\/li>\n<li>Necesita una gesti\u00f3n de grupos de dependencias madura.<\/li>\n<li>Su equipo valora un largo historial y una documentaci\u00f3n establecida.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es la velocidad. La poes\u00eda puede tardar m\u00e1s de <code>uv<\/code> para las instalaciones en fr\u00edo, la generaci\u00f3n de archivos de bloqueo y las adiciones de paquetes. Para proyectos peque\u00f1os, esto puede no importar. Para proyectos grandes y canalizaciones de CI, la diferencia puede volverse notable.<\/p>\n<h3>Conda: el elemento cient\u00edfico<\/h3>\n<p>Conda sigue siendo una de las herramientas m\u00e1s importantes para Python cient\u00edfico, especialmente cuando el proyecto necesita dependencias que no sean de Python.<\/p>\n<p>Conda es \u00fatil para la investigaci\u00f3n porque puede administrar paquetes de Python, paquetes R, bibliotecas compiladas, compiladores, MPI, HDF5, CUDA y otras dependencias a nivel de sistema en un entorno.<\/p>\n<p>Conda es importante cuando:<\/p>\n<ul>\n<li>Necesita dependencias que no sean de Python como C, C++, MPI, HDF5, FFTW o CUDA.<\/li>\n<li>Se dirige a cl\u00fasteres de HPC.<\/li>\n<li>Sus bibliotecas cient\u00edficas dependen de un c\u00f3digo C o FORTRAN compilado.<\/li>\n<li>Trabajas en Python y R.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es que la conda puede ser m\u00e1s lenta que <code>uv<\/code> para la resoluci\u00f3n de la dependencia de Python pura y puede que no produzca archivos de bloqueo universales multiplataforma con la misma facilidad.<\/p>\n<h4>Flujo de trabajo b\u00e1sico de la CONDA<\/h4>\n<pre><code class=\"language-bash\"># Create environment\nconda create -n my-sim python=3.11\nconda activate my-sim\n\n# Install packages, including non-Python dependencies\nconda install numpy scipy hdf5 openmpi\n\n# Export to environment file\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n\n# Restore the environment\nconda env create -f environment.yml\n<\/code><\/pre>\n<h3>Pip-Tools: la opci\u00f3n minimalista<\/h3>\n<p><code>pip-tools<\/code> Puente los flujos de trabajo de PIP tradicionales y los archivos de bloqueo. Es ligero y permanece cerca de la interfaz PIP.<\/p>\n<p>Use herramientas PIP cuando:<\/p>\n<ul>\n<li>Quieres un enfoque simple.<\/li>\n<li>Est\u00e1s migrando desde PIP y no quieres aprender una herramienta m\u00e1s grande.<\/li>\n<li>Su proyecto es peque\u00f1o y no necesita grupos de dependencias avanzados.<\/li>\n<\/ul>\n<p>La compensaci\u00f3n es que las herramientas pip pueden generar archivos de salida espec\u00edficos de la plataforma. Tambi\u00e9n es menos completo que la poes\u00eda o <code>uv<\/code>.<\/p>\n<h2>PEP 751: El futuro de los archivos de bloqueo<\/h2>\n<p>PEP 751 propone un formato de archivo estandarizado para grabar dependencias de Python para que los entornos puedan instalarse de forma reproducible. Este formato se llama <code>pylock.toml<\/code>.<\/p>\n<h3>lo que resuelve<\/h3>\n<p>Las herramientas de dependencia de Python han utilizado hist\u00f3ricamente diferentes formatos de archivo de bloqueo. PDM, PIP Freeze, PIP-tools, poes\u00eda y <code>uv<\/code> todos los entornos de enfoque se bloquean de manera diferente.<\/p>\n<p>Esto crea varios problemas:<\/p>\n<ul>\n<li>Bloqueo de vendedor. Puede ser dif\u00edcil cambiar entre herramientas.<\/li>\n<li>Fragmentaci\u00f3n de herramientas. Los esc\u00e1neres de seguridad y las herramientas de automatizaci\u00f3n pueden admitir solo algunos formatos.<\/li>\n<li>Dificultad de auditor\u00eda. Los diferentes formatos tienen diferentes sintaxis y convenciones.<\/li>\n<\/ul>\n<p>PEP 751 propone <code>pylock.toml<\/code> como un formato estandarizado.<\/p>\n<h3>Por qu\u00e9 es importante para Python cient\u00edfico<\/h3>\n<p>El formato propuesto es \u00fatil para la investigaci\u00f3n porque es:<\/p>\n<ul>\n<li>Legible por humanos, usando TOML.<\/li>\n<li>generado por m\u00e1quina, por lo que las herramientas pueden escribir una salida consistente.<\/li>\n<li>consumible por herramientas que no son de Python.<\/li>\n<li>Seguro por dise\u00f1o, con hashes criptogr\u00e1ficos para la protecci\u00f3n de la cadena de suministro.<\/li>\n<li>Lo suficientemente flexible como para representar m\u00faltiples entornos o grupos de dependencias.<\/li>\n<\/ul>\n<p>Una vez que se adopta ampliamente, <code>pylock.toml<\/code> puede reducir la necesidad de formatos de archivo de bloqueo espec\u00edficos de la herramienta. Para los investigadores, esto significa una mejor interoperabilidad. Un archivo de bloqueo podr\u00eda ser consumido por cualquier herramienta compatible y auditado m\u00e1s f\u00e1cilmente por servicios externos.<\/p>\n<h2>El espectro de reproducibilidad<\/h2>\n<p>La reproducibilidad es un espectro. El nivel correcto depende del riesgo, la duraci\u00f3n del proyecto y los requisitos de publicaci\u00f3n.<\/p>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Nivel<\/th>\n<th>Enfoque<\/th>\n<th>Costo<\/th>\n<th>reproducibilidad<\/th>\n<th>mejor para<\/th>\n<\/tr>\n<tr>\n<td>Bueno<\/td>\n<td>Dependencias de documentos en L\u00e9ame<\/td>\n<td>M\u00ednimo<\/td>\n<td>verificaci\u00f3n manual<\/td>\n<td>Scripts y tutoriales r\u00e1pidos<\/td>\n<\/tr>\n<tr>\n<td>Mejor<\/td>\n<td>Archivo de entorno como <code>requirements.txt<\/code> o <code>environment.yml<\/code><\/td>\n<td>Bajo<\/td>\n<td>Instalaci\u00f3n automatizada<\/td>\n<td>Proyectos compartidos y colaboradores<\/td>\n<\/tr>\n<tr>\n<td>Mejor<\/td>\n<td>Entorno Lockfile Plus controlado por versiones<\/td>\n<td>Moderar<\/td>\n<td>reproducci\u00f3n exacta<\/td>\n<td>Publicaciones y archivos a largo plazo<\/td>\n<\/tr>\n<tr>\n<td>M\u00e1ximo<\/td>\n<td>Contenedorizaci\u00f3n con Docker o Singularidad<\/td>\n<td>Elevado<\/td>\n<td>Aislamiento fuerte<\/td>\n<td>HPC y flujos de trabajo publicados<\/td>\n<\/tr>\n<\/tbody><\/table>\n<p>Para proyectos de investigaci\u00f3n, el m\u00ednimo es fijar versiones exactas en <code>requirements.txt<\/code> o <code>environment.yml<\/code>. El enfoque recomendado es utilizar <code>uv lock<\/code> o exportaci\u00f3n de conda para generar un archivo de entorno reproducible. La mejor pr\u00e1ctica es rastrear ese archivo en Git y documentar c\u00f3mo recrear el entorno en el archivo L\u00e9ame.<\/p>\n<h2>Flujos de trabajo pr\u00e1cticos para proyectos cient\u00edficos<\/h2>\n<h3>Flujo de trabajo 1: Nuevo proyecto de simulaci\u00f3n con UV<\/h3>\n<pre><code class=\"language-bash\"># Initialize project\nuv init my-simulation --python 3.11\ncd my-simulation\n\n# Add core dependencies\nuv add numpy scipy matplotlib\n\n# Add scientific libraries\nuv add fipy mpmath\n\n# Generate lockfile\nuv lock\n\n# Add dev dependencies\nuv add --group dev pytest black ruff\n\n# Commit everything\ngit add pyproject.toml uv.lock\ngit commit -m \"Initial project structure with pinned dependencies\"\n<\/code><\/pre>\n<p>Esto funciona porque el archivo <code>uv.lock<\/code> est\u00e1 comprometido con git. Cualquiera que clone el repositorio y ejecute <code>uv sync<\/code> obtiene las mismas versiones resueltas.<\/p>\n<h3>Flujo de trabajo 2: Proyecto HPC con Conda y Singularidad<\/h3>\n<pre><code class=\"language-bash\"># On your workstation\nconda create -n hpc-sim python=3.11\nconda activate hpc-sim\nconda install numpy scipy hdf5 openmpi\n\n# Export environment\nconda env export --no-builds | grep -v \"prefix:\" &gt; environment.yml\n\n# Build Singularity image from Docker\ndocker build -t my-sim:latest .\nsingularity build my-sim.sif docker:\/\/my-sim:latest\n\n# Transfer to HPC cluster\nscp my-sim.sif hpc-cluster:\/scratch\/\n<\/code><\/pre>\n<p>Esto funciona porque Conda administra las dependencias de la estaci\u00f3n de trabajo, mientras que Singularity proporciona una contenedorizaci\u00f3n compatible con HPC. El archivo <code>environment.yml<\/code> se puede controlar y volver a crear en otro sistema.<\/p>\n<h3>Flujo de trabajo 3: migraci\u00f3n de PIP a UV<\/h3>\n<pre><code class=\"language-bash\"># Start with existing requirements.txt\npip install uv\n\n# Replace pip with uv for installs\nuv pip install -r requirements.txt\n\n# Generate a uv lockfile\nuv lock\n\n# From now on, use uv sync instead of pip install\nuv sync\n<\/code><\/pre>\n<p>Esta ruta de migraci\u00f3n es simple porque <code>uv<\/code> es compatible con muchos flujos de trabajo de estilo PIP. El archivo <code>uv.lock<\/code> se convierte en la \u00fanica fuente de verdad para el entorno.<\/p>\n<h2>Errores comunes y c\u00f3mo evitarlos<\/h2>\n<h3>Error 1: Uso de dependencias no ancladas<\/h3>\n<pre><code class=\"language-python\"># WRONG: Allows automatic updates\nnumpy&gt;=1.0\nscipy&gt;=1.0\n\n# RIGHT: Pin exact versions\nnumpy==1.26.4\nscipy==1.11.4\n<\/code><\/pre>\n<p>Los cambios de versi\u00f3n menores pueden alterar el comportamiento num\u00e9rico, los criterios de convergencia o la precisi\u00f3n del punto flotante. Fija las versiones exactas cuando la reproducibilidad importa.<\/p>\n<h3>Error 2: no cometer ning\u00fan archivo de bloqueo<\/h3>\n<p>Si su repositorio contiene <code>pyproject.toml<\/code> pero no lockfile, su proyecto no es totalmente reproducible. Un archivo de bloqueo es el requisito m\u00ednimo para las compilaciones deterministas.<\/p>\n<p>Genere un archivo de bloqueo y confirme:<\/p>\n<pre><code class=\"language-bash\">uv lock  # or conda export\ngit add uv.lock  # or environment.yml\ngit commit -m \"Add lockfile for reproducible environment\"\n<\/code><\/pre>\n<h3>Error 3: ignorar las subdependencias<\/h3>\n<p>Incluso si fija paquetes de nivel superior, las subdependencias a\u00fan pueden cambiar el comportamiento.<\/p>\n<pre><code class=\"language-python\"># If you pin fipy but not its dependencies:\n# numpy, mpmath, and other packages may upgrade independently\n<\/code><\/pre>\n<p>Utilice una herramienta que resuelva y ancla el \u00e1rbol de dependencia completo, como <code>uv<\/code>, Conda o Poes\u00eda.<\/p>\n<h3>Error 4: entornos espec\u00edficos de la plataforma<\/h3>\n<p>Algunas herramientas pueden generar una salida espec\u00edfica de la plataforma. Si desarrolla en macOS pero implementa en Linux, los archivos de entorno pueden fallar o resolver de manera diferente.<\/p>\n<p>Utilice herramientas que admitan archivos de bloqueo multiplataforma o generen archivos de bloqueo en la plataforma de destino.<\/p>\n<h3>Error 5: Dependencias de datos externas<\/h3>\n<p>Si una simulaci\u00f3n depende de API externas o de bases de datos que cambian, la reproducibilidad puede romperse incluso cuando el entorno de Python est\u00e1 bloqueado.<\/p>\n<p>Snapshot datos externos cuando sea posible. Si eso no es posible, utilice puntos de enlace de API versionados y documente la versi\u00f3n exacta o la fecha de acceso.<\/p>\n<h2>Lo que recomendamos: Un marco de decisi\u00f3n<\/h2>\n<p>Utilice este marco de decisi\u00f3n al elegir una herramienta de gesti\u00f3n de dependencias para un proyecto cient\u00edfico de Python.<\/p>\n<ol>\n<li>\n<p>\u00bfNecesita dependencias que no son de Python como C, C++, MPI, CUDA, HDF5 o FFTW?<\/p>\n<ul>\n<li>S\u00ed: use Conda, o use Conda dentro de Docker o Singularity.<\/li>\n<li>No: Contin\u00fae con la siguiente pregunta.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfEst\u00e1s publicando un paquete de Python en PYPI?<\/p>\n<ul>\n<li>S\u00ed: Considere la poes\u00eda para los flujos de trabajo de publicaci\u00f3n maduros o <code>uv<\/code> para la velocidad.<\/li>\n<li>No: Contin\u00fae con la siguiente pregunta.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfEst\u00e1s trabajando en canalizaciones CI\/CD?<\/p>\n<ul>\n<li>S\u00ed: use <code>uv<\/code> porque las instalaciones m\u00e1s r\u00e1pidas pueden reducir el tiempo de CI.<\/li>\n<li>No: O <code>uv<\/code>, Conda o poes\u00eda pueden funcionar dependiendo del proyecto.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u00bfQu\u00e9 tan importante es la compatibilidad multiplataforma?<\/p>\n<ul>\n<li>Alto: use <code>uv<\/code> donde un archivo de bloqueo universal se ajuste a sus necesidades.<\/li>\n<li>Moderado: Conda puede funcionar bien, especialmente en sistemas de investigaci\u00f3n tipo UNIX.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Para la mayor\u00eda de los nuevos proyectos de investigaci\u00f3n, <code>uv<\/code> es un valor predeterminado fuerte cuando necesita velocidad y reproducibilidad. Para proyectos de HPC o flujos de trabajo con dependencias que no son de Python, empareja conda con la contenedorizaci\u00f3n.<\/p>\n<h2>Resumen<\/h2>\n<p>La gesti\u00f3n de dependencias en Scientific Python no es opcional. Es una base de investigaci\u00f3n reproducible.<\/p>\n<p>Los puntos m\u00e1s importantes son:<\/p>\n<ol>\n<li>Los archivos de bloqueo son esenciales. Fija las versiones exactas y s\u00edguelas en Git.<\/li>\n<li><code>uv<\/code> es una opci\u00f3n moderna y fuerte para entornos r\u00e1pidos y reproducibles.<\/li>\n<li>Conda sigue siendo vital para las pilas cient\u00edficas con dependencias que no son de Python.<\/li>\n<li>PEP 751 tiene como objetivo unificar los formatos de archivo de bloqueo a trav\u00e9s de <code>pylock.toml<\/code>.<\/li>\n<li>Un README con instrucciones de instalaci\u00f3n claras es la documentaci\u00f3n m\u00ednima que necesita todo proyecto.<\/li>\n<\/ol>\n<p>Comience por auditar los proyectos actuales. Compruebe si los entornos est\u00e1n documentados y las dependencias est\u00e1n ancladas. Convierta un proyecto para usar un archivo de bloqueo. El costo inicial vale la pena cuando usted u otro investigador necesita volver a ejecutar la simulaci\u00f3n meses o a\u00f1os despu\u00e9s con confianza.<\/p>\n<h2>Gu\u00edas relacionadas<\/h2>\n<ul>\n<li><a href=\"https:\/\/matforge.org\/reproducible-research-workflows-docker-and-conda-for-simulation-projects\/\">Flujos de trabajo de investigaci\u00f3n reproducibles: Docker y Conda para proyectos de simulaci\u00f3n<\/a> \u2014 Aprenda c\u00f3mo Docker y Conda se complementan entre s\u00ed para la reproducibilidad de la simulaci\u00f3n.<\/li>\n<li><a href=\"https:\/\/matforge.org\/unit-testing-scientific-code-pytest-strategies-research-projects\/\">pruebas unitarias de c\u00f3digo cient\u00edfico: estrategias pytest para proyectos de investigaci\u00f3n<\/a> \u2014 patrones de CI para reproducir Tuber\u00edas de simulaci\u00f3n.<\/li>\n<li><a href=\"https:\/\/matforge.org\/gpu-acceleration-for-fipy-simulations-cupy-and-numba-integration-guide\/\">Aceleraci\u00f3n de GPU para simulaciones FIPY: integraci\u00f3n de CUPY y NUMBA Gu\u00eda<\/a> \u2014 Gestione las dependencias de GPU con PYPI y Conda.<\/li>\n<li><a href=\"https:\/\/matforge.org\/working-through-your-first-fipy-example\/\">trabajando a trav\u00e9s de su primer ejemplo de fipy<\/a>: comience con un proyecto fipy administrado por dependencias.<\/li>\n<\/ul>\n<h2>Referencias y lectura adicional<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.astral.sh\/uv\/\">documentaci\u00f3n uv<\/a> \u2014 Gu\u00eda oficial para el administrador de paquetes basado en \u00f3xido.<\/li>\n<li><a href=\"https:\/\/peps.python.org\/pep-0751\/\">PEP 751: Especificaci\u00f3n de Pylock.toml<\/a> \u2014 propuesta de formato de archivo de bloqueo estandarizado.<\/li>\n<li><a href=\"https:\/\/book.the-turing-way.org\/reproducible-research\/overview\/overview-definitions\/\">The Turing Way: Definiciones de investigaci\u00f3n reproducibles<\/a> \u2014 Normas comunitarias para flujos de trabajo reproducibles.<\/li>\n<li><a href=\"https:\/\/lincolnloop.github.io\/python-package-manager-shootout\/\">Python Package Manager Shootout<\/a> \u2014 Comparaci\u00f3n de referencias UV, poes\u00eda, pip-tools, PDM y PIXI.<\/li>\n<li><a href=\"https:\/\/wagtail.org\/blog\/uv-overtakes-poetry\/\">wagtail: UV supera la poes\u00eda<\/a> \u2014 Se\u00f1al de adopci\u00f3n de la industria.<\/li>\n<\/ul>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>La gesti\u00f3n de las dependencias en Python cient\u00edfico es una de las partes m\u00e1s importantes de la investigaci\u00f3n reproducible. Una simulaci\u00f3n puede fallar meses despu\u00e9s porque cambiaron las versiones de paquetes, se cambi\u00f3 un int\u00e9rprete de Python o una biblioteca num\u00e9rica actualizada de manera que afecte a los resultados. Esta gu\u00eda explica c\u00f3mo los archivos [&hellip;]<\/p>\n","protected":false,"raw":""},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"es_ES","_original_post":"https:\/\/matforge.org\/?p=391","iawp_total_views":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-570","post","type-post","status-publish","format-standard","hentry","category-simulation-modeling-projects","es-ES"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gesti\u00f3n de dependencias en Python cient\u00edfico<\/title>\n<meta name=\"description\" content=\"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gesti\u00f3n de dependencias en Python cient\u00edfico\" \/>\n<meta property=\"og:description\" content=\"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-22T08:17:35+00:00\" \/>\n<meta name=\"author\" content=\"Elena Markovska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elena Markovska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/\"},\"author\":{\"name\":\"Elena Markovska\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"headline\":\"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad\",\"datePublished\":\"2026-07-22T08:17:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/\"},\"wordCount\":2677,\"commentCount\":0,\"articleSection\":[\"Simulaci\u00f3n &amp; Proyectos de modelado\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/\",\"name\":\"Gesti\u00f3n de dependencias en Python cient\u00edfico\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-22T08:17:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\"},\"description\":\"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/es\\\/managing-dependencies-scientific-python-lockfiles-environments\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/980162bb5de46742daece973661d93da\",\"name\":\"Elena Markovska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g\",\"caption\":\"Elena Markovska\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/elena-markovska\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gesti\u00f3n de dependencias en Python cient\u00edfico","description":"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/","og_locale":"es_ES","og_type":"article","og_title":"Gesti\u00f3n de dependencias en Python cient\u00edfico","og_description":"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.","og_url":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/","og_site_name":"matforge.org","article_published_time":"2026-07-22T08:17:35+00:00","author":"Elena Markovska","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Elena Markovska","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/"},"author":{"name":"Elena Markovska","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"headline":"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad","datePublished":"2026-07-22T08:17:35+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/"},"wordCount":2677,"commentCount":0,"articleSection":["Simulaci\u00f3n &amp; Proyectos de modelado"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/","url":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/","name":"Gesti\u00f3n de dependencias en Python cient\u00edfico","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-22T08:17:35+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da"},"description":"Aprenda c\u00f3mo administrar las dependencias cient\u00edficas de Python con archivos de bloqueo, UV, Conda, poes\u00eda, entornos y flujos de trabajo reproducibles.","breadcrumb":{"@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/es\/managing-dependencies-scientific-python-lockfiles-environments\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/es\/"},{"@type":"ListItem","position":2,"name":"Gesti\u00f3n de dependencias en Python cient\u00edfico: archivos de bloqueo, entornos y reproducibilidad"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/980162bb5de46742daece973661d93da","name":"Elena Markovska","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2de4e35b6581d7d8a839335156c6b5834cfaa0aef537a1c837e882dc57eea1e7?s=96&d=mm&r=g","caption":"Elena Markovska"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/elena-markovska\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=570"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/570\/revisions"}],"predecessor-version":[{"id":719,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/570\/revisions\/719"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}