2010-09-07 14 views
8

Sto scrivendo uno script python (Linux) che aggiunge shell aliases (li scrive su HOME/.bash_aliases).Python 'source HOME/.bashrc' con os.system()

Al fine di creare un alias a disposizione subito dopo che è stato scritto che dovrei dare il seguente bash built-in:

source HOME/.bashrc 

source è un bash built-in, quindi non posso solo:

os.system(source HOME/.bashrc) 

se provo qualcosa di simile:

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

... si blocca lo script (proprio come è in attesa di qualcosa).

Qualche suggerimento?

risposta

5

Quello che vuoi non è possibile. Un programma (il tuo script) non può modificare l'ambiente del chiamante (la shell da cui lo esegui).

Un altro approccio che consente di eseguire una chiusura è scriverlo in termini di una funzione di bash, che viene eseguita nello stesso processo e può modificare il chiamante. Nota che il sourcing durante il runtime può avere effetti collaterali negativi a seconda di ciò che l'utente ha nel proprio bashrc.

+0

Grazie per il vostro feedback. In parallelo ho fatto qualche ricerca, e sì, hai ragione, quello che voglio non è del tutto possibile. La soluzione alternativa è scrivere uno script bash ed eseguirlo se necessario. Ma stavo pensando che modificare l'ambiente in fase di esecuzione può essere pericoloso, soprattutto se il server sta già eseguendo script "intensivi". –

+0

@Andrei Ho provato a usare uno script bash per fare il sorgente, ma non ha funzionato neanche. – peacepassion

3

quello che stai cercando di fare è impossibile. o meglio: come stai cercando di farlo è impossibile.

  1. vostro comando bash è sbagliato. bash -s command non esegue command. memorizza semplicemente la stringa "comando" nella variabile $1 e quindi ti porta al prompt. questo è il motivo per cui lo script python sembra bloccarsi. cosa intendevi fare è bash -c command.

  2. perché fonte .bashrc? non sarebbe sufficiente solo la fonte .bash_aliases?

  3. anche se hai ottenuto correttamente il comando bash, le modifiche avranno effetto solo nella sessione di bash avviata da python. una volta che la sessione di bash è stata chiusa e il tuo script python è terminato, sei tornato alla tua sessione bash originale. tutte le modifiche nella sessione di bash avviate da Python vengono perse.

Ogni volta che si desidera modificare qualcosa nella sessione di bash corrente, è necessario farlo dall'interno della sessione di bash corrente. la maggior parte dei comandi eseguiti da bash (comandi di sistema, script python, persino script di bash) genererà un altro processo e tutto ciò che fai in quell'altro processo non influirà sulla tua prima sessione di bash.

source è un built-in bash che consente di eseguire comandi all'interno della sessione bash in esecuzione, invece di generare un altro processo e di eseguire i comandi lì. la definizione di una funzione bash è un altro modo per eseguire comandi all'interno della sessione bash in esecuzione.

vedere this answer per ulteriori informazioni sull'approvvigionamento e l'esecuzione.

che cosa si può fare per ottenere quello che vuoi

modificare lo script python per fare solo le modifiche necessarie per .bash_aliases.

preparare uno script di bash per eseguire lo script python e quindi l'origine .bash_aliases.

#i am a bash script, but you have to source me, do not execute me. 
modify_bash_aliases.py "[email protected]" 
source ~/.bash_aliases 

aggiungere un alias al vostro .bashrc alla fonte che lo script

alias add_alias='source modify_bash_aliases.sh' 

ora quando si digita add_alias some_alias in bash richiede che sarà sostituito con source modify_bash_aliases.sh e poi giustiziato. poiché source è un built-in bash, i comandi all'interno dello script verranno eseguiti all'interno della sessione bash in esecuzione. lo script python verrà comunque eseguito in un altro processo, ma il successivo comando source verrà eseguito all'interno della sessione bash in esecuzione.

un altro modo

modificare lo script python fare solo le modifiche necessarie per .bash_aliases.

preparare una funzione di bash per eseguire lo script python e quindi l'origine .bash_aliases.

add_alias() { 
    modify_bash_aliases.py "[email protected]" 
    source ~/.bash_aliases  
} 

ora è possibile chiamare la funzione in questo modo: add_alias some_alias

0

[[soluzione di lavoro]]

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

Ho avuto un problema interessante in cui avevo bisogno di fonte un file RC per ottenere l'output corretto nel mio script python.

Alla fine ho usato questo all'interno della mia funzione per portare le stesse variabili dal file bash di cui avevo bisogno per l'origine. Assicurati di aver importato.

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 
Problemi correlati