2017-01-26 10 views
0

Pythonでコマンドラインbashスクリプトを実行することはできますか?私はsubprocess.call/check_outputを知っていて、パラメータを持つ単一のコマンドを実行します。しかし、どのように実行するのですか?Pythonでbashコマンドラインスクリプトを実行する

for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do 
    git tag -a -m"Converting SVN tags" \ 
     `echo $tag | grep "tags/" |sed 's/.*tags\///'` \ 
     refs/remotes/$tag 
done 

pythonでは?私はシェルスクリプトに "行"を入れて、Pythonに呼び出させたくありません。

ありがとうございます!

+1

[pythonスクリプトでbashコマンドを実行するにはどうすればいいですか?](http://stackoverflow.com/questions/26236126/how-to-run-bash-command-inside-python-script) – Priya

+4

実際にはPython内からシェルコマンドラインを起動することは可能ですが、これは[XY Problem](http://xyproblem.info/)です。あなたはそれをしたくありません。このコードでは、より良い質問があります。「私は現在、シェルで以下を実行していますが、うまくいくかもしれませんが、特に同じ結果を生成するPythonで何かを実装する必要があります。私の試行の後にエラーメッセージが表示されます。」* – ghoti

+0

しかし、良い最初のステップは、あなたが現在持っているシェルコードを単純化することです。たとえば、 'git branch -r | grep "tags /" 'は' git branch --list -r 'tags/*' 'に置き換えることができます。 'git tag'の引数として使用されるコマンド置換は単に" $ {tag#* tags /} "'に置き換えることができます(おそらく)。 – chepner

答えて

1

あなたは2つの方法で行くことができるのpythonためにbashスクリプトからの変換:

  1. あなたがプログラムの呼び出しを引き継ぎ、ちょうどループ/文字列処理を置き換え、例えばこのように:

    from subprocess import check_output 
    for line in check_output('git branch -r', shell=True).split("\n"): 
        line = line.strip() 
        # do your replaces here, etc. leaving that for an exercise for you 
        # run more `check_call` or `check_output` here 
    
  2. 「正しい方法」を実行してください。 a python git module。あなたはボックス機能のうち多くを取得し、あなたの「すぐに一緒にハッキングシェルの呼び出し」のように、少ないバグを持っているとして、それは最初に、より多くの仕事だが、長期的に有益

編集:コメンターは当然のとおり、 shell=Trueを避けてください。この場合、check_output(['git', 'branch', '-r'])が確かに良いでしょう。他のケースでは、で、Linuxシステム上で特定のシェル(bashなど)でPythonスクリプトが実行されることがわかっている場合は、shell=Trueを指定すると、 .bashrc、グロビングなどがあります。詳しくは、hereを参照してください。

+0

コマンドを分割することを除いて、シェルがここで役に立つものを提供していないので、 'shell = True'を指定しないで' check '出力([' git '、' branch '、' -r '])あなたは簡単にあなた自身を行うことができます。 (確かに、読みにくいですが、この小さなメリットよりも大きなメリットがあります)。http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess – tripleee

+0

@tripleee:thanksポインタの場合、一般的に私は 'shell = True'はシェルからPythonへの道を滑らかにすると思いますが、最終的にはどこでも動作するスクリプトがほしいでしょうが、確かにshell = Trueの場合はそうではありません。私は答えにセクションを追加しました – hansaplast

+1

非常に良い更新、+1。私は 'shell = True'に対して注意する傾向があります。なぜなら、人々はスタックオーバーフローからコードをコピー/ペーストする傾向があり、その影響を理解することができません。したがって、少なくとも呼び出さなければ、大きな副作用を伴う構造は問題になります。 – tripleee

関連する問題