Mac OS X: изменение $PATH из скрипта Python

Mac OS X: изменение $PATH из скрипта Python

У меня есть куча скриптов python. Один из них устанавливает программное обеспечение (subversion), которое требует добавления своего пути в $PATH. После установки я хочу, чтобы следующий скрипт использовал это программное обеспечение. Если я запускаю export PATH=/opt/subversion/bin:$PATHв bash между первым и вторым скриптом, все в порядке. Но если я добавляю os.system( 'export PATH=/opt/subversion/bin:$PATH' )в качестве последней команды первого скрипта (который устанавливает subversion), $PATHостается неизменным после его завершения.

Можно ли как-то изменить $PATH из скрипта Python, чтобы он оставался измененным после завершения скрипта (конечно, внутри одного сеанса bash, я об этом знаю /etc/profile).

решение1

os.system()порождает дочернюю оболочку. Поэтому она не имеет сведений о вашей существующей оболочке.

Конечно, вы можете задать путь (без экспорта) при запуске команды. Например:

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

О, и os.system() устаревает. Вам следует перейти наsubprocess.Popen().

решение2

В общем случае это невозможно. Один процесс не может изменить среду другого процесса.

Родительский процесс может заранее задать среду порождаемого им дочернего процесса, но на самом деле у одного процесса нет возможности повлиять на среду другого, если только эти приложения специально не предназначены для этого.

решение3

Как уже указывали другие, нет, на самом деле, способа изменить окружение родительского процесса. Это потребовало бы возни с памятью родительского процесса, и, насколько мне известно, нет четко определенного способа сделать это (т. е. вы, скорее всего, уничтожите свою оболочку).

Если скрипты/программы, которые вы запускаете после этого, написаны на Python, вы можете первым делом в этих программах добавить путь к Subversion в их среду.

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

Или, если вы всегда запускаете одни и те же скрипты в одном и том же порядке с одними и теми же аргументами, заключите их в скрипт оболочки, который сам устанавливает для себя среду и запускает эти программы/скрипты.

Есть еще один обходной путь, как последнее, что вы делаете в скрипте, который устанавливает subversion, вы можете заменить этот процесс другой оболочкой, которая имеет нужную вам среду. Вы будете запускать bash внутри bash, но, что ж, это может послужить хорошим обходным путем.

#! /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', [])

Связанный контент