optparse_liteというコマンドラインインターフェース作成支援スクリプトを書いてみた

こんばんは。地震がまだ続いて油断ができない状態ですね。


このあいだ、コマンドラインインターフェース作成を支援するoptparseというモジュールをみつけまして、早速使ってみたんですがインターフェースのオプション(【pythoon ほにゃらら.py -x test】の -xの部分)作成を支援するだけらしく、肝心の「どういうふうに動かすか」を指定できないみたいなんです。
なので、「どういう風に動かすか」も指定できて、それで且つオプションもパースできる。そういうスクリプトを書いてみました。


ダウンロードはgithubpypiの二つからできます。
githubのほうがオススメ。更新頻度高いから。




目次




使い方

  1. モジュールをimport。
    • import optparse_lite
      

  2. オプションパーサークラスを定義。このとき、usageとversion番号を引数にいれてください。

    • このとき、usageに%progを入れるとファイル名に変換されます。
    • parser=optparse_lite.OptionParse(usage="%prog [option]", version="1.0")
      

  3. オプションを追加させる。まず最初にオプション名を書いて、そのあとは number_of_keydescactionを入力してください。

    • number_of_keyはスクリプトが取得したい引数の数を入力してください。(ほにゃらら.py -x text text だったら 2)
    • descはそのオプションの説明。
    • actionはFanctionタイプです。パーサークラスを定義する前に、このオプションで動かしたい関数を書いていてください。その関数名を入力してください。ちなみに、関数の引数は絶対リストにしてください。
    • def printout(list):
      	print list[0]
      parser.add_option("-p","--print",number_of_key=1,desc="printout",action=printout)
      

  4. runparserメソッドを動かして完了。
  5. 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

ShareSRCの更新情報!

こんばんは。
今日、バイトから帰ってきてせっせとデバッグとデザイン変更をしていました。


やっと形になったので、また紹介させていただきます。
正直、ShareSRCがこんなに反響があるとはおもいませんでした…


変更点

  • Recentのバグを退治
    • 新しい物順にするためにつけたIDに問題があったので、デバッグしました。

  • デザイン変更
    • シンプルなUIをおさえつつも、カッコいいデザインにしてみました。
    • こんなかんじです。


以上が今日の変更点です。
ShareSRCのハッシュタグを作ってみました。

#sharesrc
このハッシュタグで、要望などをつぶやいてください!

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バンザイ。


特徴

特徴は以上の二つになります。
特に、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するだけでできますね。
以上です!

メモ : Pythonの引数にダブルクオートを付けると…

知らなかったのでメモ。


どうやら、Pythonのsys.argvで引数を取得するとき、
引数に""(ダブルクオート)を付けるとダブルクオートの中身を一つの引数として取得できる。


サンプル::


import sys
for i in sys.argv:
print i
というプログラムをsample.pyとして保存し、

$ python sample.py "My name is Alice."
と打つと、
My name is Alice
という引数を取得できる。


これはいろんなところに応用できますね。