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を更新してます


【PR】搾取されてない.....!?
客先常駐で働いているエンジニアの方お疲れ様です。
IT業界でSESとして働いている人は多いんですが、自分のマージンや月額単価を知らない人がけっこう多いみたいですね。
自分もそうでした。(^^;)
でもそれかなりもったいないですよ。理由はこちらリツアンSTCの紹介記事を見てみてください。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
blog.suganoo.net

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

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

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

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