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から変数としてとったりも簡単に行えます.