2018年11月23日金曜日

Pythonのsubprocessでコマンドを実行する

Pythonからコマンドを実行するためのモジュールとしてsubprocessがある。使う機会があって調べたのでまとめておく。


環境


Ubuntu 18.04(WSL)とPython3.6.5。



コマンドの実行


とりあえずコマンドを実行してみる。run関数にオプションや引数を含めてリストにして渡すだけ。


ただ、パイプを使ったコマンドは期待通りに動作しない。



パイプを使ったコマンドの実行


パイプを使う方法としては2つある。ひとつはオプションshell=Trueとしてコマンドをシェルで実行する方法。このときはコマンドをリストではなく文字列として渡す。


ただしshell=Trueはセキュリティ上問題になる場合があるので使うには注意が必要(セキュリティで考慮すべき点)。

もうひとつの方法は、パイプでつなぐコマンドごとにPopenクラスのインスタンスを作成し、出力をsubprocess.PIPEを使って受け渡す。



エイリアスの実行


エイリアスもオプションshell=Trueで動作するかと思ったがそうはいかない(llは~/.bashrcで定義済みのエイリアスとする)。


理由はPython subprocess.call a bash aliasに説明があって、shell=Trueオプションではシェルとしてbashではなく/bin/shが使われる。さらに「shell=True, executable='/bin/bash'」オプションでbash上で動作させるようにしても、bashでは対話的(interactive)に動作するときにしか~/.bashrcの設定が反映されない。そこで、bashのオプションで対話的に動作させ、かつエイリアスコマンドを指定して実行する。Pythonの対話モードだと実行後に対話モードが終了してしまうが、llの結果はちゃんと出力される。


0 件のコメント:

コメントを投稿