質問

私はいくつかを追加しているPythonスクリプト(Linux)を書いています シェルエイリアス (それらを書き込みます HOME/.bash_aliases).

それが書かれた直後にエイリアスを利用できるようにするために、次のbashが組み込みを発行する必要があります。

source HOME/.bashrc

source 組み込みのバッシュなので、私はただできません:

os.system(source HOME/.bashrc)

私が次のようなことを試してみると:

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

...スクリプトをフリーズします(何かを待っているように)。

助言がありますか ?

役に立ちましたか?

解決

あなたが望むものは不可能です。プログラム(スクリプト)は、発信者の環境(実行するシェル)を変更できません。

近いことをすることができる別のアプローチは、同じプロセスで実行され、発信者を変更できるバッシュ関数の観点からそれを書くことです。ランタイム中のソーシングは、ユーザーがbashrcに持っているものに応じて、負の副作用を可能にする可能性があることに注意してください。

他のヒント

あなたがやろうとしていることは不可能です。またはより良い:あなたがそれをやろうとしている方法は不可能です。

  1. あなたのbashコマンドは間違っています。 bash -s command 実行しません command. 。文字列「コマンド」を変数に保存するだけです $1 そして、あなたをプロンプトに落とします。そのため、Pythonスクリプトがフリーズしているようです。あなたがするつもりだったのはです bash -c command.

  2. なぜあなたは情報を提供するのですか .bashrc?調達するだけでは十分ではないでしょうか .bash_aliases?

  3. 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top