python 'source home/.bashrc' with os.system()
質問
私はいくつかを追加しているPythonスクリプト(Linux)を書いています シェルエイリアス (それらを書き込みます HOME/.bash_aliases
).
それが書かれた直後にエイリアスを利用できるようにするために、次のbashが組み込みを発行する必要があります。
source HOME/.bashrc
source
組み込みのバッシュなので、私はただできません:
os.system(source HOME/.bashrc)
私が次のようなことを試してみると:
os.system('/bin/bash -c source HOME/.bashrc')
...スクリプトをフリーズします(何かを待っているように)。
助言がありますか ?
解決
あなたが望むものは不可能です。プログラム(スクリプト)は、発信者の環境(実行するシェル)を変更できません。
近いことをすることができる別のアプローチは、同じプロセスで実行され、発信者を変更できるバッシュ関数の観点からそれを書くことです。ランタイム中のソーシングは、ユーザーがbashrcに持っているものに応じて、負の副作用を可能にする可能性があることに注意してください。
他のヒント
あなたがやろうとしていることは不可能です。またはより良い:あなたがそれをやろうとしている方法は不可能です。
あなたのbashコマンドは間違っています。
bash -s command
実行しませんcommand
. 。文字列「コマンド」を変数に保存するだけです$1
そして、あなたをプロンプトに落とします。そのため、Pythonスクリプトがフリーズしているようです。あなたがするつもりだったのはですbash -c command
.なぜあなたは情報を提供するのですか
.bashrc
?調達するだけでは十分ではないでしょうか.bash_aliases
?Bashコマンドを正しく取得したとしても、Pythonから開始されたBashセッションでの変更のみが変更されます。そのbashセッションが閉じられ、Pythonスクリプトが完成したら、元のBashセッションに戻ります。 Pythonから開始されたBashセッションのすべての変更は失われます。
現在のBASHセッションで何かを変更するたびに、現在のBASHセッション内からそれを行う必要があります。 Bash(システムコマンド、Pythonスクリプト、さらにはBash Scripts)から実行するコマンドのほとんどは別のプロセスを生み出し、その他のプロセスで行うことはすべて、最初のBashセッションには影響しません。
source
別のプロセスを生み出してコマンドを実行する代わりに、現在実行中のバッシュセッション内でコマンドを実行できるBASHビルドインです。 BASH関数を定義することは、現在実行されているBASHセッション内でコマンドを実行する別の方法です。
見る この答え ソーシングと実行の詳細については。
あなたが望むことを達成するためにあなたができること
Pythonスクリプトを変更して、必要な変更を行うだけです .bash_aliases
.
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
バッシュプロンプトでは、それが置き換えられます source modify_bash_aliases.sh
そして実行しました。以来 source
Bash Builtinです。スクリプト内のコマンドは、現在実行中のBashセッション内で実行されます。 Pythonスクリプトはまだ別のプロセスで実行されますが、その後 source
コマンドは、現在実行中のBASHセッション内で実行されます。
別の方法
Pythonスクリプトを変更して、必要な変更を行うだけです .bash_aliases
.
Pythonスクリプトを実行してからソース .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()
Pythonスクリプトで正しい出力を取得するためにRCファイルを調達する必要があるという興味深い問題がありました。
最終的にこれを私の関数内で使用して、ソースに必要なBASHファイルから同じ変数を持ち込みました。必ずOSをインポートしてください。
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