• DoRubyとは
  • お問い合わせ
  • Ruby/Rails
  • Web開発
  • Webマーケティング
  • アピリッツ
  • ライフハック
  • ゲーム制作/開発
  • Railsの小技
  • Rubyの小技
  • Gemの紹介
  • ActiveRecord
  • 初心者向け
  • Java/Scalaテク
  • Unixのあれこれ
  • データベース
  • スマホ開発
  • HTML/CSS/JavaScript
  • デザイン製作
  • インフラ
  • クラウド
  • セキュリティ
  • エディタ
  • バージョン管理
  • その他
  • python
  • アクセス解析
  • Googleアナリティクス
  • Googleデータスタジオ
  • Web広告
  • SEO
  • UI/UX
  • ソーシャルメディア
  • EC開発
  • Webシステム開発
  • コンサルティング
  • Webデザイン
  • ブロックチェーン
  • ゲーム紹介
  • アプリ紹介
  • ASP
  • 風景
  • パソコン
  • ツール
  • ガジェット
  • 仕事術
  • 健康
  • 生活
  • 書評
  • Excel(エクセル)
  • PowerPoint(パワーポイント)
  • ゲームプランニング
  • SpriteStudio
  • マスターデータ入力/作成
  • Unity
  • キャラクターデザイン
  • ゲームシナリオ
  • レベルデザイン
  • ゲーム分析
  • 3DCG
  • イラスト制作
  • CG/アニメーション
  1. ホーム
  2. Web開発
  3. python
  4. pythonでコマンドを扱う
  • 2017-11-21
    • カテゴリ:
    • python

pythonでコマンドを扱う

この記事は公開から1年以上が経過しています。情報が古い可能性がありますのでご注意ください。

pythonで標準入力と標準出力を扱います。

概要

pythonに慣れていて手軽に書けるので、他の言語でできることでもなるべくpythonでやりたいです。
ローカルマシンのプロセスをダンプする必要があったんですが、シェルスクリプトを書きたくなかったのでpythonで書きました。

コード

pythonのバージョンは3.6.1です。

import subprocess
import shlex
import os
from datetime import datetime

command = "ps alx"
log_file = os.path.dirname(os.path.abspath(__file__)) + "/process.log"

def main():
    buf_list = []
    buf_list.append(get_current_time())

    for i in readline_stdout():
        buf_list.append(i)

    write_file_to_log(buf_list)


# 現在時刻を取得
def get_current_time():
    current_time = datetime.now().strftime("%Y/%m/%d %H:%M:%S") + " ---------------------------------------------------------------------------------\n"
    return current_time


# 標準出力を一行ずつ受け取る
def readline_stdout():
    proc = subprocess.Popen(shlex.split(command), stdout = subprocess.PIPE, stderr = subprocess.PIPE)

    while True:
        line = proc.stdout.readline()
        yield line.decode("utf-8")

        if not line and proc.poll() is not None:
            break


# ファイルに出力
def write_file_to_log(logs):
    file = open(log_file, 'a')
    file.writelines(logs)


if __name__ == "__main__":
    main()
# 実行結果の一部
2017/11/22 18:00:22 ---------------------------------------------------------------------------------
  UID   PID  PPID CPU PRI NI      VSZ    RSS WCHAN  STAT   TT       TIME COMMAND
    0     1     0   0  37  0  2536056   6748 -      Ss     ??    1:00.50 /sbin/launchd
    0    50     1   0  37  0  2550352  37604 -      Ss     ??    0:08.14 /usr/libexec/UserEventAgent (System)
    0    51     1   0   4  0  2515384   2672 -      Ss     ??    0:01.24 /usr/sbin/syslogd
    0    53     1   0  20  0   663372   1216 -      Ss     ??    0:00.56 /Applications/.esets/Contents/MacOS/esets_ctl
    0    54     1   0  20  0  2498064  10000 -      Ss     ??    0:01.52 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
    0    55     1   0  37  0  2546936  12252 -      Ss     ??    0:02.51 /usr/libexec/kextd

ポイント

ポイントは2つです。
1. subprocessを使って標準入力と標準出力を扱う
2. shlexを使って文字列をシェルスタイルでパースする

subprocessを使って標準入力と標準出力を扱う

pythonでコマンドを扱う方法はcmdやos.system()など複数ありますが、subprocessを使うのがスタンダードなやり方っぽいです。

shlexを使う

今回のスクリプトを書いている中での最大の学びはshlexです。
たとえば、今回のコマンドは"ps alx"をそのまま渡してるんですが、shlex.split()を使わない場合は、["ps", "alx"]としてやる必要があります。
長いコマンドを処理したい時は面倒なので、shlexを使ってやると非常に便利です。

追記

shlex.splitを使わなくても、subprocess.Popemの引数にshell = True パラメーターを与えてやると"ps alx"でもうまくいきます。
shell = True パラメーターで処理をする利点は、"ps alx | grep hogeみたいにパイプ("|")を使ったコマンドが利用できるということです。
shlex.splitでパイプの入ったコマンドを利用しようとすると上手く処理できません。

追記その2

出力先ファイルのパス指定を修正しました。
cronで回したときに"process.log"だと実行時のパスが一致しないので、絶対パスを取得してやる必要がある。


  • 160 views
    • Tweet
    • このエントリーをはてなブックマークに追加

この記事を書いた人
baguette
読み方はバゲットです。

「いいね!」するとDoRubyの最新記事を受け取ることができます。

Facebook

Twitterから最新記事を受け取るならこちら

Follow @doruby

Feedlyから最新記事を受け取るならこちら

follow us in feedly

おすすめの記事
  • 1,839 views
  • 2016-07-27
リニューアルをしたDoRubyの3つの目的
  • 1,737 views
  • 2016-08-15
ビット演算でフラグを管理する
  • 1,354 views
  • 2017-04-24
アピリッツの新卒合宿2017

カテゴリ

Ruby/RailsRailsの小技Rubyの小技Gemの紹介ActiveRecord初心者向けWeb開発Java/ScalaテクUnixのあれこれデータベーススマホ開発HTML/CSS/JavaScriptデザイン製作インフラクラウドセキュリティエディタバージョン管理その他pythonWebマーケティングアクセス解析GoogleアナリティクスGoogleデータスタジオWeb広告SEOUI/UXソーシャルメディアアピリッツEC開発Webシステム開発コンサルティングWebデザインブロックチェーンゲーム紹介アプリ紹介ASP風景ライフハックパソコンツールガジェット仕事術健康生活書評Excel(エクセル)PowerPoint(パワーポイント)ゲーム制作/開発ゲームプランニングSpriteStudioマスターデータ入力/作成Unityキャラクターデザインゲームシナリオレベルデザインゲーム分析3DCGイラスト制作CG/アニメーション

    人気の記事
    • 29 views
    • 2019-12-09
    どうしようもないけどやれるだけのことはやってどうにかしよう
    最近の記事
    • 29 views
    • 2019-12-09
    どうしようもないけどやれるだけのことはやってどうにかしよう
    • 62 views
    • 2019-10-18
    カスタマーサポートの極意 2019 #3 レポート
    • 342 views
    • 2019-08-16
    Search Engineerring Tech Talk 2019 Spring レポート
    • 472 views
    • 2019-07-24
    Rails & Webpack案件でのgmo paymentのトークン決済
    • 469 views
    • 2019-07-12
    whenever で時刻を設定する際システムで設定されているのとは別のタイムゾーンを使用する
    Facebook

      サイト情報
      • DoRubyとは
      • 株式会社アピリッツ

      ソーシャルアカウント
      • Facebook
      • Twitter

      企業情報
      • 会社概要
      • 採用情報
      • お問い合わせ
      サービス製品
      • レコメンドASP
      • サイト内検索ASP「Advantage Search」
      • オープンソースECサイト構築パッケージ「エレコマ」
      • 受注・在庫・商品情報一元管理「モールコネクター」
      • セキュリティ診断サービス
      • Googleアナリティクスセミナー

      Copyright © Appirits All Rights Reserved.