Источник Python ' HOME/.bashrc и с ОС.система()
Я пишу скрипт python (Linux), который добавляет некоторые оболочки псевдонимы (записывает их в HOME/.bash_aliases
).
чтобы сделать псевдоним доступным сразу после его написания, я должен выпустить следующий встроенный bash:
source HOME/.bashrc
source
это встроенный Баш, поэтому я не могу просто:
os.system(source HOME/.bashrc)
если я попробую что-то вроде:
os.system('/bin/bash -c source HOME/.bashrc')
...заморозит скрипт (так же, как чего-то ждет).
любой предложения ?
4 ответов
то, что вы хотите не возможно. Программа (ваш скрипт) не может изменять среду вызывающего абонента (оболочку, из которой Вы ее запускаете).
другой подход, который позволит вам сделать что-то близкое, - это написать его в терминах функции bash, которая запускается в том же процессе и может изменять вызывающего. Обратите внимание, что поиск во время выполнения может иметь возможные негативные побочные эффекты в зависимости от того, что пользователь имеет в своем bashrc.
то, что вы пытаетесь сделать, это невозможно. или лучше: то, как вы пытаетесь это сделать, невозможно.
ваша команда bash неверна.
bash -s command
не выполнятьcommand
. он просто хранит строку "command" в переменнойа затем опускает вас в приглашение. вот почему скрипт python, кажется, замерзает. то, что вы хотели сделать, это
bash -c command
.почему вы источник
.bashrc
? не было бы достаточно просто source.bash_aliases
?даже если вы получили правильную команду bash, изменения вступят в силу только в сеансе bash, начатом с python. как только этот сеанс bash будет закрыт, и ваш скрипт python будет выполнен, вы вернетесь к исходному сеансу bash. все изменения в сеансе bash, запущенном с python, потеряны.
каждый раз, когда вы хотите изменить что-то в текущем сеансе bash, вы должны сделать это изнутри текущего сеанса bash. наиболее команды, которые вы запускаете из bash (системные команды, скрипты python, даже скрипты bash), породят другой процесс, и все, что вы делаете в этом другом процессе, не повлияет на ваш первый сеанс bash.
source
- это встроенный bash, который позволяет выполнять команды внутри текущего сеанса bash, вместо того, чтобы порождать другой процесс и запускать команды там. определение функции bash-это еще один способ выполнения команд внутри текущего bash сессия.
посмотреть ответ для получения дополнительной информации о поиске и исполнении.
что вы можете сделать, чтобы достичь того, чего вы хотите
измените свой скрипт python, чтобы просто сделать изменения, необходимые для .bash_aliases
.
подготовьте скрипт bash для запуска скрипта python, а затем source .bash_aliases
.
#i am a bash script, but you have to source me, do not execute me.
modify_bash_aliases.py "$@"
source ~/.bash_aliases
добавить псевдоним в свой .bashrc
для источника этого скрипта
alias add_alias='source modify_bash_aliases.sh'
теперь, когда вы типа add_alias some_alias
in ваша подсказка bash будет заменена на source modify_bash_aliases.sh
и затем казнен. с source
является встроенным bash, команды внутри скрипта будут выполняться внутри текущего сеанса bash. скрипт python все равно будет работать в другом процессе, но последующий source
команда будет работать внутри вашего текущего сеанса bash.
другой способ
измените свой скрипт python, чтобы просто сделать изменения, необходимые для .bash_aliases
.
подготовить Баш функция для запуска скрипта python, а затем source .bash_aliases
.
add_alias() {
modify_bash_aliases.py "$@"
source ~/.bash_aliases
}
теперь вы можете вызвать функцию, как это: add_alias some_alias
[[рабочий раствор]]
http://stackoverflow.com/questions/6856119/can-i-use-an-alias-to-execute-a-program-from-a-python-script
import subprocess
sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"])
sp.communicate()
У меня была интересная проблема, когда мне нужно было создать RC-файл, чтобы получить правильный вывод в моем скрипте python.
Я в конечном итоге использовал это внутри моей функции, чтобы принести те же переменные из файла bash, который мне нужен для источника. Обязательно импортируйте ОС.
with open('overcloudrc') as data:
lines = data.readlines()
for line in lines:
var = line.split(' ')[1].split('=')[0].strip()
val = line.split(' ')[1].split('=')[1].strip()
os.environ[var] = val