Mac OS X: cambie $PATH desde el script de Python

Mac OS X: cambie $PATH desde el script de Python

Tengo un montón de scripts de Python. Uno de ellos instala software (subversión) que requiere que su ruta se agregue a $PATH. Una vez instalado, quiero que el siguiente script utilice el software. Si ejecuto export PATH=/opt/subversion/bin:$PATHbash entre el primer y el segundo script, todo está bien. Pero si agrego os.system( 'export PATH=/opt/subversion/bin:$PATH' )como último comando del primer script (que instala Subversion), $PATHpermanece inalterado después de salir.

¿Hay alguna forma de cambiar $PATH desde el script de Python para que permanezca modificado después de que finalice el script (dentro de una sesión de bash única, por supuesto, lo sé /etc/profile)?

Respuesta1

os.system()genera una subcapa. Por lo tanto, no tiene conocimiento de su shell existente.

Por supuesto, puede establecer la ruta (sin exportar) al ejecutar el comando. Es decir:

PATH="$PATH:/opt/subversion/bin" /command/to/run

Ah, y os.system() se está depreciando. Deberías cambiar asubprocess.Popen().

Respuesta2

Generalmente eso no es posible. Un proceso no puede cambiar el entorno de otro proceso.

Un padre puede preestablecer el entorno de un proceso hijo que genera, pero realmente no hay ninguna manera de que un proceso influya en el entorno de otro a menos que esas aplicaciones estén diseñadas específicamente para permitirlo.

Respuesta3

Como otros han señalado, no, en realidad no hay ninguna forma de modificar el entorno de un proceso principal. Sería necesario juguetear dentro de la memoria del proceso principal y, hasta donde yo sé, no hay una forma bien definida de hacerlo (es decir, probablemente bloquearía su shell).

Si los scripts/programas que ejecuta después son Python, lo primero que puede hacer en esos programas es anteponer la ruta a la subversión en su entorno.

import os
os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']

O si siempre ejecuta los mismos scripts en el mismo orden con los mismos argumentos, envuélvalos en un script de shell que establece el entorno por sí mismo y ejecuta esos programas/scripts.

También existe otra solución, ya que lo último que debe hacer en el script que instala Subversion es reemplazar ese proceso con otro shell que tenga el entorno que desea. Ejecutarás un bash dentro de bash, pero bueno, podría servir como una buena solución.

#! /usr/bin/env python

# do stuff
# install subversion
# do more stuff

# at the point you exit
if everything_went_well:
  import os
  os.putenv('PATH', '/opt/subversion/bin:' + os.environ['PATH'])
  os.execv('/bin/bash', [])

información relacionada