pythonでシェルを実行する方法

サーバーでのちょっとした処理をpythonで書くことがあるんだけど
pythonからシェルを実行するのどうやるんだっけ?
毎回忘れてしまうので、メモしておく。

とりあえずの使い方

import subprocess

cmd = "ls -l"
subprocess.Popen(cmd, shell=True)
subprocess.call(cmd, shell=True)
  • とりあえず実行なら、subprocess.call()
  • バックグランドでやるなら、subprocess.Popen()

って感じでシェル実行できます。

cmd = "sleep 5"

とかにして↑をやってみると、Popenは裏で実行されてるから
待たないことがわかると思う。

【未経験からプログラマ】完全無料であなたの就職をサポート

あとは誰かの解説を見ておこう

ほかにも
subprocess.check_call(cmd)
subprocess.check_output(cmd)
があるらしいけど、俺が説明するより
他の方がありがたくもまとめてくれてるのでこっちの方がわかりやすい!
qiita.com




コマンドにスペースが入ってるとエラーになるよ、と解決方法

先に答えをいうと shell=True なんだけどね。

コマンドを実行させるとき shell=True なしで、コマンドにスペースが入ってるとこんなエラーが起きる。

たとえば

cmd = "ls -l"

で実行すると

python test.py
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    subprocess.call(cmd)
  File "/usr/lib64/python2.6/subprocess.py", line 478, in call
    p = Popen(*popenargs, **kwargs)
  File "/usr/lib64/python2.6/subprocess.py", line 642, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1238, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

このエラーで小一時間つぶしてしまった。

pythonってたまにエラーメッセージが適切でないことがある気がする。。。

こちらもありがたくも他の方が調べてくれてます。
助かりますねー!!!
qiita.com

(このなかのstackoverflow)
stackoverflow.com

If passing a single string, either shell must be True or else the string must simply name the program to be executed without specifying any arguments.

shell=Trueをつけて実行すればOKですね!

subprocess.call(cmd, shell=True)


もしくは

import shlex
subprocess.call(shlex.split(crop))

shlex.split(cmd)だって。


みんな詳しんだな。
【未経験からプログラマ】完全無料であなたの就職をサポート

(Pythonに関連したこんな記事もあります)
python カテゴリーの記事一覧 - S氏はたまにblogを更新してます in hatena

Pythonプロフェッショナルプログラミング 第3版

Pythonプロフェッショナルプログラミング 第3版

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで