Python 'source HOME / .bashrc' с помощью os.system () - PullRequest
8 голосов
/ 07 сентября 2010

Я пишу скрипт на Python (Linux), который добавляет псевдонимы оболочки (записывает их в HOME/.bash_aliases).

Чтобы сделать псевдоним доступным сразу после его написания, я должен выпустить следующую встроенную команду bash:

source HOME/.bashrc

source является встроенным в bash, поэтому я не могу просто:

os.system(source HOME/.bashrc)

Если я попробую что-то вроде:

os.system('/bin/bash -c source HOME/.bashrc')

... заморозит скрипт (как будто чего-то ждет).

Есть предложения?

Ответы [ 4 ]

6 голосов
/ 07 сентября 2010

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

Другой подход, который позволил бы вам сделать что-то близкое, - это написать его в терминах функции bash, котораявыполняется в том же процессе и может изменить вызывающего.Обратите внимание, что поиск во время выполнения может иметь возможные негативные побочные эффекты в зависимости от того, что пользователь имеет в своем bashrc.

3 голосов
/ 08 сентября 2010

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

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

  2. почему вы получаете .bashrc? Разве не достаточно просто набрать .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 и затем получить исходный код .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 в приглашении bash, оно будет заменено на source modify_bash_aliases.sh и затем выполнено. поскольку source является встроенной функцией bash, команды внутри скрипта будут выполняться внутри текущей сессии bash. скрипт python по-прежнему будет выполняться в другом процессе, но последующая команда source будет выполняться внутри текущего сеанса bash.

другой способ

измените ваш скрипт на python, чтобы внести необходимые изменения в .bash_aliases.

подготовить функцию bash для запуска скрипта на python и затем получить исходный код .bash_aliases.

add_alias() {
  modify_bash_aliases.py "$@"
  source ~/.bash_aliases      
}

теперь вы можете вызывать функцию следующим образом: add_alias some_alias

0 голосов
/ 26 июля 2017

У меня была интересная проблема, когда мне нужно было получить 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
0 голосов
/ 10 января 2014

[[рабочий раствор]]

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()
...