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の結果はちゃんと出力される。
環境
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 件のコメント:
コメントを投稿