У меня есть куча скриптов на 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', [])