Назад | Перейти на главную страницу

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

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

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

Как правило, это невозможно. Один процесс не может изменить среду другого процесса.

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

os.system() порождает суб-оболочку. Таким образом, он ничего не знает о вашей существующей оболочке.

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

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

О, и os.system () обесценивается. Вам следует переключиться на subprocess.Popen().

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

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

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