22998


初めて質問させて頂きます。宜しくお願い致します。

subprocessモジュールを使用し、指定したディレクトリの  
データサイズを取得するshellを実行し、結果を判定する処理を作成しております。

取得するディレクトリ( **/var/hoge** とします。)のデータサイズの取得は  
Linuxのduコマンドを用いて取得しようと考えております。

その際に、subprocess.check_output()を用いて  
引数でコマンドを実行し、出力結果を取得して判定したいのですが

①duコマンドの出力結果をうまく整形したい  
（試行錯誤し、一応できましたが、このやり方しかないのでしょうか）

②バイト文字列のキャストは int(ret) のような書き方しかないでしょうか。

が知りたいです。

実行環境  
Linux OS: Laspbian kernel 4.1  
Python: 2.7.9

※ /var/hoge のサイズは 4096byteとした場合  
下記でコマンドを実行した際は

[code]

    4096    /var/hoge
    
[/code]

となります。

4096だけを取り出し  
指定したサイズと比較したいとした場合。

作成したコード

[code]

    import subprocess
    
    def testcall():
        reta = []
        cmd = "du -b /var/hoge"
        ret = subprocess.check_output(cmd, shell=True)
        reta = ret.split()
        size = 1024
        if int(reta[0]) >= int(size) :
            print('DirSize:[%d] ' % int(reta[0]) )
        return
    
[/code]

思っていること  
・リストretaを介さなければいけないのか。  
・リストretaは毎回キャストしなければいけない？

言葉足らずであったばあい、申し訳御座いません。  
宜しくお願い致します。


CC BY-SA 3.0
2016-03-10T13:50:50.053
22991
2016-03-12T13:50:26.237
14694
question
python linux raspberry-pi
subprocessのcheck_callでディレクトリサイズを出力結果として保持したい


以下のものでいかがですか?
基本的には御提示になったようにすると思います．あとsizeは1024を代入した時点で`int`なのでcastする必要はないです．文字列から`int`にcastするのは`int()`でいいです．

[code]

    import subprocess
    
    def testcall():
        cmd = "du -b /var/hoge"
        dsize = int(subprocess.check_output(cmd, shell=True).split()[0])
        size = 1024
        if dsize >= size :
            print('DirSize:[%d] ' % dsize )
        return
    
[/code]


CC BY-SA 3.0
2016-03-10T16:31:21.117
22998
2016-03-12T11:34:00.237
2016-03-12T11:34:00.237
7837
14418
22991
answer


何か理由があって`du`コマンドを使っていたら申し訳ないのですが、pythonの機能でファイルサイズの取得はできますよ。

[code]

    import os
    size = os.stat('/var/hoge').st_size
    
[/code]

上記の`size`はint型になっているので、比較なども普通にできます。

<http://docs.python.jp/2.7/library/os.html#os.stat>

追記  
すみません、勘違いしていました。  
os.statで取得できるのはあくまでファイルのサイズなので、ディレクトリの場合はファイル一覧を取得してサイズを合計する必要があります。


CC BY-SA 3.0
2016-03-12T10:41:22.743
23059
2016-03-12T13:50:26.237
2016-03-12T13:50:26.237
3589
3589
22991
answer