Источник 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.


то, что вы пытаетесь сделать, это невозможно. или лучше: то, как вы пытаетесь это сделать, невозможно.

  1. ваша команда bash неверна. bash -s command не выполнять command. он просто хранит строку "command" в переменной а затем опускает вас в приглашение. вот почему скрипт python, кажется, замерзает. то, что вы хотели сделать, это bash -c command.

  2. почему вы источник .bashrc? не было бы достаточно просто source .bash_aliases?

  3. даже если вы получили правильную команду 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