PythonからUNIXコマンドを使いたい。そんな時があると思います!(多分滅多にないと思うけど)今回は、「ls」コマンドをPythonスクリプトから実行していこうと思います。
subpocessモジュールを利用
今回の用件を満たすのに必要なのは、「subprocessモジュール」になります。Python3.5から*subprocess.run()*というメソッドでサブプロセスをつなげて、コマンドを走らせるという方法が推奨されているみたい...
os.systemとかos.spawn*の代用だそうですね
というわけで、subprocessモジュールを使用していきます。
インポートはそのままです。
import subprocess
subprocess.run()で実際に走らせる
それでは早速「ls」コマンドを走らせてみましょう。(実行結果はディレクトリ構造に依存するので、人により異なります)
import subprocess
res = subprocess.<span class="function">run(
['ls']
)
print(res)
この実行結果は以下になります。
CompletedProcess(args=['ls'], returncode=0)
特段注意すべきは、コマンドをリスト又はタプルで入力することでしょうか。基本的にスペースを入れることはできません。引数やフラグを足す際に、スペースが必要ならば、リストやタプルにカンマ(,)で区切りましょう。
と言いますか...ん??
ディレクトリ群出てこないんですけど...
というのも、あくまで返ってくるのはsubprocess.CompletedProcessクラスだからですね。
CompletedProcessをいじってみる
実行出来たはずなのに、結果が帰って来ないようじゃ意味がないので中身を開けていきましょう。
CompletedProcessクラスには以下のメソッドや変数が存在しています。
- .args
- .returncode
- .stdout
- .check_returncode()
- .stderr
これから先のチェックは、さきのプログラムの続き。returnされたものはresに入っている。
print(res.args)
# >>> ['ls']
print(res.returncode)
# >>> 0
print(res.stdout)
# >>> None
print(res.stderr)
# >>> None
という結果に...
プログラムが期待通り終了した場合、0が返ってきます。
ただ、標準出力、標準エラーにはNoneが返ってきていますね。どこにも結果がないのだけど...
実行結果をみる!!
実は、subprocess.run()には、出力をキャプチャする引数があったみたいです。それがcapture_output。これをTrueにすると出力が保存されます。
import subprocess
res = subprocess.<span class="function">run(['ls'], capture_output=True)
print(res)
# >>> CompletedProcess(args=['ls'], returncode=0,
stdout=b'Applications\nLibrary\nSystem\nUsers\nVolumes\nbin\ncores\ndev\netc\nhome\nopt\nprivate\nsbin\ntmp\nusr\nvar\n',
stderr=b'')
これで出力をみることができました。
他にもコマンドを使うことができるので、必要に応じてsubprocessモジュールを使ってみてください。
今回はこれにて終了!