optparse_liteというコマンドラインインターフェース作成支援スクリプトを書いてみた
こんばんは。地震がまだ続いて油断ができない状態ですね。
このあいだ、コマンドラインインターフェース作成を支援するoptparseというモジュールをみつけまして、早速使ってみたんですがインターフェースのオプション(【pythoon ほにゃらら.py -x test】の -xの部分)作成を支援するだけらしく、肝心の「どういうふうに動かすか」を指定できないみたいなんです。
なので、「どういう風に動かすか」も指定できて、それで且つオプションもパースできる。そういうスクリプトを書いてみました。
ダウンロードはgithubとpypiの二つからできます。
githubのほうがオススメ。更新頻度高いから。
- github -> https://github.com/alice-himmel/Optparse_lite
- pypi -> http://pypi.python.org/pypi/optparse_lite
- easy_install optparse_lite でもOK
目次
使い方
- モジュールをimport。
- オプションパーサークラスを定義。このとき、usageとversion番号を引数にいれてください。
- このとき、usageに%progを入れるとファイル名に変換されます。
- オプションを追加させる。まず最初にオプション名を書いて、そのあとは number_of_keyとdescとactionを入力してください。
- number_of_keyはスクリプトが取得したい引数の数を入力してください。(ほにゃらら.py -x text text だったら 2)
- descはそのオプションの説明。
- actionはFanctionタイプです。パーサークラスを定義する前に、このオプションで動かしたい関数を書いていてください。その関数名を入力してください。ちなみに、関数の引数は絶対リストにしてください。
- runparserメソッドを動かして完了。
import optparse_lite
parser=optparse_lite.OptionParse(usage="%prog [option]", version="1.0")
def printout(list): print list[0] parser.add_option("-p","--print",number_of_key=1,desc="printout",action=printout)
parser.runparser()
これで、動きます。
サンプル
#!/usr/bin/python #coding: utf-8 import optparse_lite def printstring(locallist): print locallist[0] def calc(locallist): l = locallist print int(l[0]) + int(l[1]) usage = "usage: %prog [option]" version = "1.0.0" parser = optparse_lite.OptionParse(usage, version) parser.add_option( "-p", "--print", number_of_key=1, desc="Print String.", action=printstring ) parser.add_option( "-c", "--calc", "---calc-nums", number_of_key=2, desc="Calcuation your num. ex):-c 2 3 -> 5", action=calc ) parser.runparser()
まだ不十分なところ
- まだヘルプ表示がうまくいってない。インデントもぐちゃぐちゃだし、気持ち悪い状態。
- 関数への引数の渡し方がリストオンリーなのが不十分。まぁ普通にリストから引数をとってきてくれればいいんだけど…
こんなかんじです。
オプションをばしばし使ってコマンドラインインターフェースを実装したい方はぜひ使ってみてくださいね!
PS
MOONGIFT(http://www.moongift.jp/)さんにて、ShareSRCの記事が書かれていました。自分が作ったアプリケーションが記事になるなんて初めてで、とても嬉しいです。
MOONGIFTさん、ありがとうございました。
ユーザ登録不要で使えるソースコード共有システム「ShareSRC」
http://www.moongift.jp/r/2011/03/20110320/
ShareSRC - ソースコード共有サイト
http://sharesrc.appspot.com
GAEでのちょっとした小技
今回は、GAEでのちょっとした小技を紹介します。
GAEでは、ファイルをアップロードするのにapp.yamlというファイルを使います。
そのapp.yamlにアップロードするファイルを書きこんでいくのですが、ファイルが多くなってくると、全部書きこんでいくのは面倒です。
そこで、この小技を使います。
要は、ファイルをアップロードせずにGAE上で見れるようにすればいいわけです。
class FileHandler(webapp.RequestHandler): def get(self): f = self.request.get("file") self.response.out.write(open(f,"r").read()) application = webapp.WSGIApplication([ ('/', MainHandler), ('/f',FileHandler)],debug=True)
このようなページ(クラス)を書いておけば、
http://xxxx.appspot.com/f?file=yyyyyy.cssこのようなページにリクエストを送ればそのファイルの中身を取得できるわけです。
つまり、CSSを指定するときも、
<link rel="stylesheet" href="/f?file=yyyy.css">
このように書いておけば良いわけです。
以上が小技です。
コレ、簡単ですけど結構使えるモノなので、ぜひつかってみてください。
ShareSRCというソースコード共有サイトを立ち上げました
こんばんは。
今回、ShareSRCというWEBサービスを立ち上げたので、紹介させていただきます。
ShareSRC - ソースコードを共有しよう!
http://sharesrc.appspot.com/
ShareSRCとは、ひとえにソースコードを共有するサービスです。
ソースコードにはタイトルを付けることが出来ます。
また、共有したソースコードにはトークンがつけられ、その値によって管理されています。
またまたGAEで作りました。Pythonバンザイ。
特徴
- 1, forkができる。
- 2, ダウンロード用のPythonスクリプトを提供
- 3, Google製シンタックスハイライタを適用
- Google製のハイライターを適用しているので、多くの言語をハイライトできます。
特に、2番目の特徴は今までにないものではないでしょうか。
仕様について
GAEで動いています。
このShareSRCでは、トークンを使ってソースコードを管理しています。
トークンはランダムな30文字です。
データストアにはタイトル,ソースコード、トークン、ID,forkedという5要素を挿入しています。
forkedは「どこからforkされたか」、を示すトークンです。
今回は、テンプレートをつかって、綺麗なHTMLソースを実現できています。
HTMLの制作はCodaで行いました。Zen-Coding用のプラグインを入れてあるので楽です。
Google製のシンタックスハイライターは便利なのですが、通常のテキストでもハイライトしてしまうので、
ShareSRCはソースコード以外(メモのようなものを)を共有するのには向いていません。
制作期間
今回も制作期間は2日です。バイトから帰ってきてからコーディングしかしてません←
感想
シンタックスハイライタを適用するのが面倒でした。最初どんなものを用意すればいいかわからず、右往左往していましたがなんとかできました。
今度はブログに挑戦したいと思います。不安ばかりですが。
ShareSRC、ぜひ使ってみてくださいね!!
ShareSRC - ソースコードを共有しよう
http://sharesrc.appspot.com
Pythonでshellを実行する
Pythonではできないものをシェルを使って実行したいというときはありますよね?
Pythonでは、shellを実行するには2通りがあります。
- 実行後の値がほしい場合 -> commands.getoutput()
- 実行するだけでいい場合 -> os.system()
commands.getoutput()
>>> import commands >>> pwd = commands.getoutput("pwd") >>> print pwd /Users/Alice/
このように、commands.getoutput()では実行後の値を取得することが出来ます。
僕が造ったAnalyzeDirectoryでは、これを使ってls -lコマンドを実行し、各ファイルに対してアプローチを施しています。
os.system()
>>> import os >>> pwd = os.system("pwd") /Users/Alice >>> print pwd 0
このように、os.system()では、実行するだけで、その実行した値を取得することは出来ません。
以上です。
Pythonで簡易エディタを作る
今回はpythonでエディタをつくってみましょう。
まず、エディタを作るには、とりあえず入力された行を保存する必要があります。
ここでは、リストを使って行を保存します。
このようにすることで、入力された行をリストの中に保存することができます。
raws = []
while True:
cont = raw_input(">> ")
raws.append(cont)
これをファイルに保存するためには、
このようにします。そうすれば、各行に改行が追加されます。
Contents = '\n'.join(cont)
あとは、これをファイルオブジェクトにwriteすれば完成です。
僕が書いたデモ版を載せておきます。
#!/usr/bin/python #coding:utf-8 import sys,os contents = [] filename = sys.argv[1] i = 1 while True: edit = raw_input("%s > " % i) if edit == "exit": if os.access(filename,os.F_OK): print "'%s' is Already exist." % filename break else: f = open(filename,"w") f.write('\n'.join(contents)) f.close() print "Maked." break else: contents.append(edit) i += 1
行が分かりやすいように行番号を指定しているのと、exitと打たれたらファイルに保存する、ということをしています。
これを応用すれば、一時的に何かのものにコメントを要求して保存することもできますね。
これで簡易エディタの完成です。
コマンドを増やせば、行の削除などを実装できると思います。
行を削除するだけならば、リストの-1の要素をpopかremoveするだけでできますね。
以上です!