61 件 見つかりました。

CHALOW Search - hiChangeLog ChangeLog INDEX

1 2 3 4 5 6 7 [ 次へ ]

ipythonで任意の関数の実行時にデバッガを起動する [python]

ipythonは便利だ。pdbコマンドをトグルしておくとキャッチしてない例外発生時に自動的にそこに飛んでデバッガも起動してくれる。
従って、予期せぬ例外発生時には即座に対応できるし、また、怪しい箇所に適当に例外を投げるコードを入れておけば、そこからデバッガを開始できる。以下にもその旨解説されている。http://wiki.slash-reader.com/sonota--memo/ipython_
さて任意の関数の実行時にデバッガを起動したい場合どうするか。直前に述べたように、適当なコードをあらかじめ埋めておくのがひとつの方法。でもこれに以下の不満を抱くため、代替について調べた。
・コード埋める作業が面倒
・一時的な作業のためにソースファイルに手を入れたくない

runcallを使えばいけるようだ。
aはとあるクラス、fugaはそのクラスのメソッドとすれば、以下でデバッガが起動する。

In [xx]: import pdb
In [xx]: pdb.runcall(a.fuga)
引数を渡す場合は以下の様にする。
pdb.runcall(a.fuga, s1='foo', s2='bar')
さてこのpdbはpythonのデバッガだが、これに比べ、上で述べたipythonで起動してくれるデバッガは、色付けなんかをしてくれて圧倒的に見易い。こちらを使いたい場合は以下の様にする。(引数の文字列"Linux"で色使いを指定している。これが無いと色はつかない)
In [xx]: import IPython
In [xx]: p = IPython.Debugger.Pdb('Linux')
In [xx]: p.runcall(a.fuga, s1='foo', s2='bar')

Webで調べたところ、コードに pdb.set_trace とか例外コードを埋め込む解説が目立ったので、もしかしたら上記方法は作法としての欠点があるのかもしれないが、個人的には好みなのでしばらくこれでいってみる。

以下pdbについてのページ。
pdb の使い方 -- 導入編
pdb の使い方 -- コマンド編
Pythonのデバッガ(pdb)を使う

呼出し元の関数を調べる [python]

例えば以下のようにすれば、呼んだ関数が列挙される。

for record in inspect.stack():
    print record[3],

MoinMoinを触った [python]

MoinMoinを触ってみた。1.8.5。いい感じ。
ロクにマニュアルも見ていないが、身勝手な不満:
(1)添付ファイルへのリンクがファイルと直接繋がっていない(その添付ファイルにまつわるページに行く)
(2)添付ファイルリストが名前順であり、日付順にできない。

(1)
この不満はviewメソッドの振舞にある:getメソッドが私の望む動作である。
同様に考える人は多いようだが、設計上の一貫性から、設定で変更というわけにもいかぬようだ。
[Moin-user] Changing default behavior on downloads.
なので無理矢理変える方法を考える。
viewメソッドで、action/AttachFile.py中の、_do_viewが呼ばれる。よってここで、getメソッドの中身である_do_getを呼んでしまうのがひとつのテ。
attachment書式にviewメソッドを割当てているのはformatter/text_html.py 中 attachment_linkなので、これをgetにする方が素直な方法だろう。

(2)
action/AttachFile.py 中 _build_filelist をいじる必要がある。ここに添付ファイル名がfilesとなるリストに格納されており、この順に(ブラウザ上に見える)添付ファイルリストが作られているようだ。なんで、その処理の前に日付でソートしてしまえばよい。例えば14行目あたり、"if files:"以降に下記を入れる。

       d = {}
        for file in files:
            fullpath = os.path.join(attach_dir, file).encode(config.charset)
            st = os.stat(fullpath)
            d[file] = request.user.getFormattedDateTime(st.st_mtime)
        d = sorted(d.items(), key=lambda (k, v): (v, k))
        files = map(lambda t:t[0], d)

これらの改造が悪影響を出さぬ事を祈る。

Acrobatを用いて外部プロセスからPDFにリンクを設定 [COM][python][PyWin32][PDF]

[2007-01-31-01]に「javascriptによるPDFリンク制御は上書きのみ」などと書いたが、やってみたらできた。また、[2007-01-08-01]にCOMからのリンク作成は無理っぽいなどと書いたが、これもjavascriptを経由しできた。顛末をメモする。WinXP SP3 Acrobat 9.1.3 pro

まずは結論。以下のスクリプトが動いた。
python(PyWin32):

import win32com.client
import winerror
win32com.client.dynamic.ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL) # omajinai

doc = win32com.client.Dispatch("AcroExch.App").GetActiveDoc().GetPDDoc()
jso = doc.GetJSObject() # <= this requires omajinai
link = jso.addLink(0, (70,70,225,50))
link.borderWidth = 3
link.borderColor = (u'RGB', 0, 0, 255)
link.setAction("this.pageNum = 2")

javascript: (コンソールにペーストして全部選択しCtrl+Enterすれば実行できる)
var linkRect = [70,70,225,50];
var link1= this.addLink(0, linkRect);
link1.borderWidth = 3;
link1.borderColor = color.blue;      
link1.setAction("this.pageNum = 2")

--

Acrobatには豊富なjavascript APIが提供されている。COMインターフェースもあるが、これよりも充実している。
Adobe - Acrobat Developer Center - JavaScript for Acrobat
Adobe - Acrobat Developer Center - Interapplication Communication <= COM
Acrobatを完全操作するにはJavaScriptオブジェクト(JavaScriptAPI)を覚えないとダメ!?

Adobe Acrobat 7.0例文辞典にも文例が豊富。

さてCOMによるAcrobatの操作のためには、上記理由により、COMからのjavascript呼出しが勘所となる。このためのJSObjectなるインターフェースが用意されており、VBによる例文が上のリンク中"Developing Applications Using Interapplication Communication"に出ている。(C/C++からの利用方法は多少異なるようである。JS オブジェクトを C / C++ から利用する方法についてなるそのものズバリの記述もあるがこちらは試してない。

あとはこれをpythonから呼ぶだけだが、GetJSObjectメソッドは、戻り値がちょっと特殊でLPDISPATCH*となっており、そのままではエラーが出て実行できない。回避のためには、ERRORS_BAD_CONTEXTに上記の通り値をappendしてやればよい。[python-win32] COM, Acrobat and JavaScript

revtexでbibtex使用時5人以上の著者でet al.にするためのスクリプトを書いた [TeX][python]

revtexとbibtex使用時、referenceで5人以上の著者に対しet al.で省略したいと思った。
こんな機械的な操作は当然便利な方法が用意されているものと思ったが、どうやらそうではない。

http://authors.aps.org/revtex4/revtex4_faq.html#b9

At the request of the editors, the truncation only happens when there are 10 or more authors. You will need to edit the .bbl file manually.



というわけでpythonで書いてみた。出力されたbblを直接いじっているだけ。元のファイルは".orig"を付与し保存する。

fname = 'del.bbl'
maxlen = 5

import re, os
output = ''
fnameorig = fname + '.orig'
if os.access(fnameorig, os.F_OK):
    s = open(fnameorig).read()
else:
    s = open(fname).read()
    open(fnameorig, 'w').write(s)
head, sep, body = s.partition(r'\bibitem')
output += head
reg = re.compile(r'(\\bibitem.+?)\n\n', re.DOTALL)
reg_bibitem = re.compile(r'(.+?)((?: *?\\bibinfo{author}.+?(?=\\bibinfo))+)(.+)', re.DOTALL | re.MULTILINE)
for r in reg.finditer(sep + body):
    bibitembody = r.group(1)
    rr = reg_bibitem.search(bibitembody)
    if rr:
        output += rr.group(1) # head
        authors = rr.group(2)
        a = r'\bibinfo{author}'
        authorlist = authors.split(a)[1:] # the first element is blank
        if len(authorlist)>maxlen:
            output += (a + authorlist[0]).strip().replace(',', ' \\textit{et al.},\n')
        else:
            output += authors
        output += rr.group(3) # tail
        output += '\n\n'
    else:
        print '***** error ! *****\n', bibitembody

output += '\\end{thebibliography}\n'
open(fname, 'w').write(output)

ipythonでページャ(less)と代替コンソールの導入 [python]

windowsでipythonをもっと便利に使うためのメモ。

inspectやhelpの際にテキストがダーっと出てくるが、進むのみで戻れない。戻って見るためにどうすればよいか?

まずページャを導入する。デフォルトでは"a very limited builtin pager"が使われるため「戻る」動作ができないのであった。
ページャとしてlessを使うなら、環境変数 PAGER に less を、LESS に -r を指定すればよい。勿論lessはパスの通った所におく。MOSTなるページャもあるようだが使ったことはない。

これで「戻る」ができるようになるが、手元のlessバイナリでは-rオプションをつけても制御文字がちゃんと表示されなかった。色をつけようとしている部分にゴミが一杯ついて正視に耐えない。どうやらこれは既知の問題のようだ。でもcygwinのlessを試したところ、ちゃんと色がついた。2行にまたがる長い行があって"/"で検索した時なんかに画面が崩れたりしたが、再描画のrコマンドなどで回避する(lessの問題か、cygwinの問題か、windowsの問題かは知らない)。

コンソールもコマンドプロンプトから変えた方が使い勝手が良いConsoleなるコマンドプロンプト代替コンソールがあったので2.00b141を使ってみたが、結構良さそうだった。コピーのための領域選択はデフォルトでShiftを押しながら左クリックであることに注意。

コマンドプロンプトでタイトルバーの表示を変更する [Windows][python]

実行時間の長いpythonスクリプトなどを走らすと、コマンドプロンプト画面がずっと出てる。これが沢山あると、どれがどれだかわからなくなる。なので自分の好きなようにタイトルバーの文字列を設定したい。

以下のようにすればOK。(タイトルはhogeになる)

title hoge

以下はpythonスクリプトによる例。
import os, time
time.sleep(1)
os.system('title hoge')
time.sleep(1)

ref. タイトルバーの文字列を変更する

Windowsでディスプレイ(モニタ)の電源を切る [python]

import win32con, win32api
win32api.PostMessage(win32con.HWND_BROADCAST, win32con.WM_SYSCOMMAND, win32con.SC_MONITORPOWER, 1)

ref.[KNOnline.NET] - ディスプレイの電源を切る方法

IronPythonとIronPython Studioで楽々開発か [python][Windowsプログラミング]

WindowsプログラミングにはIronPythonが便利そうだなと思っていたが、同じ開発元からIronPython StudioなるIDEまでリリースされていたことを知り、導入に踏み切った。その際のメモ。

pre-requistiesを見てみるとVisual Studio 2008 Shell Isolated Mode Redistributable packageがあったのでダウンロードしインストール。場所としてC:\VS 2008 Shell Redist以下を指定し、しばらく待ったら終わった。だがその後に C:\VS 2008 Shell Redist\Isolated Mode\vs_shell_isolated.enu.exe を実行せねばインストールが真に終わらない(*)とのことで、実行した。.NET Framework 3.5のインストールの後にVS2008Shellなんちゃらのインストールが始まった。

(*) pre-requistiesのページに以下の記述があった。
After you run the Install for the MS VS 2008 Shell Isolated Mode Redistributable, you must then go to the folder (in my case: C:\VS 2008 Shell Redist\Isolated Mode) and click on: "vsshellisolated_enu.exe" to actually install the redistributable runtime.

のちに IronPythonStudioIsolated.zip をダウンロードしインストールした。スタートメニューにIronPython Studioが登場したので実行したが、ちゃんと起動できた。

Windows Applicationの新規プロジェクトを立ち上げ、Formに適当に貼り付けて実行する(この操作はVS 2003と同様)と、ちゃんと実行できた。すごい。コントロールをダブルクリックするとちゃんとpythonソースのイベントハンドラの所に飛ぶ。これはもっとすごい。

作成したプロジェクトのbinディレクトリを見ると実行ファイルができていた。同じくIronMath.dll、IronPython.dllもあり、これら3つを別のPCに持っていって、プログラムを実行できるのを確認した。うまくいきすぎて拍子抜けした。プロジェクトのプロパティで"Target Platform"が選べて、ここの値の.NETが入っているPCなら動くのだろうと理解。

できれば実行ファイルでなくスクリプトのままで動かしたいところだが、ひと手間かかるようだ。Visual Studio 2005 for IronPythonで作ったコードを ipy.exe 単体で動かせるようにするには? - ふにゃるん

起動はとても遅い。FormにボタンとNumericUpDownを配置し、メッセージボックスを出すだけのReleaseビルド実行ファイルの起動にかかる時間は、Athlon 64 X2 3800+ 2GB RAMマシンで2秒ほど、Celeron 2.5GHz 2.5GB RAMマシンに至っては15秒前後かかる。起動後の動作に特に不自然な印象は無い。

だけどまあ素早い開発ができそうなのは良い。PyWin32も結構便利な環境だが、IDEがあるあたりが良い。個人的には、NumericUpDownが簡単に使えるのが動機の大きい割合を占める。

参考:IronPythonプログラミングの始め方 − @IT

オブジェクトにまつわるソースコードはinspectで見られるようだ [python]

例えば「HTMLParser.HTMLParseErrorのコードが見たい」となったら下記のようにする。

import inspect, HTMLParser
print inspect.getsource(HTMLParser.HTMLParseError)

1 2 3 4 5 6 7 [ 次へ ]

ChangeLog INDEX
Powered by chalow