47
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

[備忘録]Pythonでシェルコマンドを動かす

Pythonでターミナル操作した時に詰まったところの備忘録

アドカレ2週目始まりました!!!
今日で10回目となりますCSGアドカレ頑張って行きましょう!!
多分三回書くのかな...
今回はPythonでターミナルを動かしたのでその備忘録を...

最近RaspberryPiを使った時にPythonで全体的に制御しながら既存のJavaで組んだプログラムを動かしたいといったことになりました.その時に色々調べつつやったのですがすこし詰まったところがあったので,その備忘録程度に...

Pythonからシェルコマンドを実行する

Pythonからシェルコマンドを動かすにはos,またはsubprocessを使うことになります.

まずosからシェルコマンドを実行してみましょう

import os

os.system('ls')

これでlsコマンドを実行できます.
次にsubprocessからシェルコマンドを実行してみましょう

import subprocess

subprocess.call('ls')

これでlsコマンドを実行できます

こういった風にシェルコマンドを実行することができます.
そして,シェルコマンドに表示されたものをpythonの変数に格納したいとなりました.

そこでsubprocessのPopenを用いて

import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,shell=True).communicate()[0]

として変数にとったのですがここで少し詰まってしまいました.

Pythonでターミナルに表示された文字を変数に取り込む

先ほどの

import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,shell=True).communicate()[0]

でとるとバイト文字列になっていたため,それをうまく扱えないといったことになっていました.ここでバイト文字列を普通の文字列へ変換する必要がありましたので

import subprocess

cmd = 'ls'
process = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')
print('コマンドは\n'+process+'です')

となり,このようにutf-8にデコードしてあげることで通常の文字列として扱うことができます.

つまり

import subprocess

cmd = 'ls'#<=ここにコマンドを当てはめる
process = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')
print('コマンドは\n'+process+'です')#何かしらの処理

としてあげれば別の言語で実行したプログラムの結果を出力して,Pythonから変数としてとったりも簡単に行えます.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
47
Help us understand the problem. What are the problem?