kuroの覚え書き

96の個人的覚え書き

python3でシェルスクリプトのようなことをする

lsをPythonで書くなら
ls.py

import os
import sys # モジュール属性 argv を取得するため

argvs = sys.argv  # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
if (argc != 2):   # 引数が足りない場合は、その旨を表示
    print('Error... no argv')
    quit()         # プログラムの終了

ls = os.listdir(argvs[1])
for f in ls:
    print(f)

こんな感じ。

python3 ls.py ./

とするとカレントディレクトリをlsしたのと同じようなリストが返る。ただし、ディレクトリのリストということで
$ ls target.txt
みたいにファイル名でリストを得ることはできないらしい。またワイルドカードも使えない。
これじゃ不便だね。

ワイルドカードにも対応させるなら
ls2.py

import sys
import glob

argvs = sys.argv  # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
if (argc != 2):   # 引数が足りない場合は、その旨を表示
    print('Error... no argv')
    quit()         # プログラムの終了

ls2 = glob.glob(argvs[1])
for f in ls2:
    print(f)

こんな感じかな。

$ python3 ls2.py "*"

これでls ./と同等
フルパスを書くと

$ python3 ls2.py "/usr/local/var/*"
/usr/local/var/homebrew
/usr/local/var/mysql

こんな感じになる。あくまでパスを表示するので*がないと普通のlsと同じ内容にならないし引数をクオーテーションで括る必要もある。

あとshというライブラリをpipでインストールすればshellコマンドが使えるようになるのだけどこれもワイルドカードが使えなかった。
ls3.py

from sh import ls
import sys # モジュール属性 argv を取得するため

argvs = sys.argv  # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
if (argc != 2):   # 引数が足りない場合は、その旨を表示
    print('Error... no argv')
    quit()         # プログラムの終了

ls1 = ls.bake(-1)    #ls -1
lsa = ls1(argvs[1])
print(las)

参考ページ
http://www.yukun.info/blog/2008/07/python-command-line-arguments.html
https://qiita.com/atsaki/items/e033ab9ca8427b1f6fd9