サーバーでのちょっとした処理を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
- 作者: 株式会社ビープラウド
- 出版社/メーカー: 秀和システム
- 発売日: 2018/06/12
- メディア: 単行本
- この商品を含むブログを見る
独学プログラマー Python言語の基本から仕事のやり方まで
- 作者: コーリー・アルソフ,清水川貴之監訳,清水川貴之,新木雅也
- 出版社/メーカー: 日経BP社
- 発売日: 2018/02/24
- メディア: 単行本
- この商品を含むブログ (4件) を見る