Hatena::Grouppython

nelnal@python

2009-08-04

[] 「Django Book」をやってみる : Chapter 3 Views and URLConf その2 11:24  「Django Book」をやってみる : Chapter 3 Views and URLConf その2 - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる : Chapter 3 Views and URLConf その2 - nelnal@python

URL設定ファイルの指定(切り替え)方法

この設定も mysite/settings.py に記述されています。

ROOT_URLCONF = 'mysite.urls'

初期設定で既に mysite/urls.py が指定されているので mysite/urls.py にURLパターン記述しただけで hello world を表示させることが可能だったのです。


同様に別のファイルにURLパターン情報を記述し、それを ROOT_URLCONF の参照先に設定・使用することも可能です。


Django の表示リクエストの処理の流れ

ここでは hello/ の表示を要求された場合の処理について記述する。

  1. hello/ についての表示リクエストを受け取る
  2. アプリケーションRootディレクトリにある settings.py の中に記述された ROOT_URLCONF の値を参照して、URL設定ファイルを決定する。
  3. URL設定ファイルの urlpatterns と hello/ を比較し、一致するものを見つける(1つ見つければ良い)。
  4. 一致する項目の表示処理(view)を呼び出す。
  5. 表示処理が HttpResponse インスタンスを戻す。
  6. Django が HttpResponse を変換してWebページに表示できる形式に変更する。

動的なページの表示(現在時刻を表示する)

Webで「Hello, world!」を表示するだけならHTMLを理解していればいっこうに問題はありません。

スクリプト言語をWebで利用する理由の1つは

ユーザーからの要求に応じて変更を施したWebページを表示することにあります。

そこで今度はユーザリクエストが行われた時刻を表示する処理を作ってみます。


以下の関数mysite/views.py に追記して下さい。

import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

mysite/urls.py には以下を追記

from mysite.views import current_datetime

urlspatterns += ('',
    (r'^time/$', current_datetime),
)

ここまで記述したらサーバーの動作を確認*1し、http://localhost:8000/time/アクセスしてみます。

「It is now (現在時刻)」と表示されれは成功です。


同じ処理を別のURLで行う

別のURLでも同じスクリプトを動かしたい場合の記述です。

と、言っても mysite/urls.py に以下の様に別のURLに同じスクリプトを割り当てるだけでOKです。

urlpatterns += ('',
    (r'^time/$', current_datetime),
    (r'^another-time-url/$', current_datetime),  # 追加
)

http://localhost:8000/another-time-url/アクセスしてみて http://localhost:8000/time/ と同じ様なページが表示されればOKです。



URLに記述された値を使って動的にページを表示する

今度は少し時間を進めたページを作ってみます。

それぞれ1時間、2時間、3時間、4時間時計を進めた時刻を表示するページを用意するものとし、URLにはそれぞれの進めている時間数(1, 2, 3, 4)を含めるものとします。


仮に mysite/urls.py を以下の様に記述してみます。

urlpatterns += patterns('',
    (r'^time/$', current_datetime),
    (r'^another-time-url/$', current_datetime),
    (r'^time/plus/1/$', time_plus_1),  # 追加。関数は未定義
    (r'^time/plus/2/$', time_plus_2),  # 追加。関数は未定義
    (r'^time/plus/3/$', time_plus_3),  # 追加。関数は未定義
    (r'^time/plus/4/$', time_plus_4),  # 追加。関数は未定義
)

既にお分かりの通り、この方法は賢い方法とは言えません。

もし、「時計を5,6,7,8時間進めた表示を行いたい場合」や「時計の進みを100時間まで1刻みで表現したい場合」に作業の手間が発生してしまいます。


そこで、以下の方法を取ることによってこの問題を解決します。

  • URL表記を一般化する → 正規表現を使用する
  • URLに書かれた値を取得して表示処理を行う

URL表記を一般化する

既にChapter 3 その1でも書いた通りURL表記には正規表現が使用可能です。

例えばこの様に記述できます。

(r'^time/plus/\d/$', time_plus),

しかし、上記の記述では time/plus/100000000 というURLにも対応されてしまいます。


ここでは2桁までに制限することとして以下の様に記述することにします。

(r'^time/plus/(\d{1,2})/$', time_plus),

(上記に対応した mysite/urls.py の記述(後部)は以下の様になります。)

urlpatterns = patterns(''
    (r'^time/$', current_datetime),
    (r'^another-time-url/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hour_plus),  # 変更。対応関数は後述
)

URLに書かれた値を取得して表示処理を行う

それでは今度は指定された値の分、時間を進めた時刻表示処理を記述します。

以下の関数mysite/views.pyに記述して下さい(current_datetime 関数の後に記述して下さい)

from django.http import Http404

def time_plus(request, offset):
    try:
        offset = int(offset)
    except ValueError:   # int(offset)に失敗した場合、404 Errorを返す
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>It is now %s</body></html>" % dt
    return HttpResponse(html)


動作確認

サーバー起動状態を確認(python manage.py runserver)後、動作確認を行います。

以下のURLの表示と表示された時刻をそれぞれ確認して下さい。


また、以下のURLの表示がエラーになることを確認して下さい。


表示関数引数の取り方について

こちらは Chapter 8 にて詳細に説明を行います。



これで Capter 3 は終了です。

Next ---> Chapter 4

*1python manage.py runserver

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090804

2009-08-02

[] 「Django Book」をやってみる : Chapter 3 Views and URLConf その1 23:18  「Django Book」をやってみる : Chapter 3 Views and URLConf その1 - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる : Chapter 3 Views and URLConf その1 - nelnal@python

Django Book
http://www.djangobook.com/en/2.0/

Hello world!

表示ページの作成

まずは前回作成した mysite のディレクトリに views.py というファイルを作成します。

次に views.py を編集します。

# -*- coding: utf-8 -*-
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world!")


URLの設定

次に URL の設定をします。

URL の設定は mysite ディレクトリ内の urls.py に記述します。

from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
)

(上記は urls.py の初期状態)


初期状態では不要なコメントが多数あってこれを残したまま解説するのは大変なので削除します。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
)

ここに views.py に書いた「Hello world!」を表示する為の設定をします。

from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    (r'^hello/$', hello)
)

これで表示の為の処理は完了です。


確認

これで「Hello world!」の表示が可能になったので確認します。

確認するURLhttp://localhost:8000/hello/ です

("python manage.py runserver"を実行してなかったら実行してください)。


いくつかのポイント

views.py について

  • views.py に記述されるのはURLを呼ばれた時に表示処理を行う関数(もしくはそのサブルーチン)です。
  • 表示処理を行う関数の名前はURL上で表現する文字列と同一である必要はありません。関数名は開発者が自由につけることができます。
  • 表示処理を関数は必ず1つの引数をとります。この引数は表示処理関数を割り当てた URL を呼び出す際に付加された情報を持っています(詳細は後述)。

urls.py について

  • urls.py はURLと表示処理関数を紐付けする為の設定を記述します。
  • URLと表示処理関数の紐付け情報は urlspattern に格納されます。また urlspattern にデータを入れる際には pattern 関数を使わなければなりません。

ursl.py の pattern 記述について

  • pattern 関数内で「^」とか「$」が使われているが、これはURL表現に正規表現を使ってるため。
  • 「^」が入ってない場合、終端に「/hello/」を含んでいるURLは全て mysite.views.hello が表示に使われることになります。
  • 「$」が入ってない場合は、先頭に「/hello/」が含まれていればそれ以降にどのような文字列URL に含まれていても mysite.views.hello が表示に使われることになります。
urlpatterns = patterns('',
    (r'^hello/', hello ),    # この場合、http://localhost:8000/hello/ から始まるURLであれば何でも良い
                             #   http://localhost:8000/hello/a
                             #   http://localhost:8000/hello/test/test/
)
urlpatterns = patterns('',
    (r'hello/$', hello ),    # この場合、hello/ で終わるURLであれば何でも良い
                             #   http://localhost:8000/20090802/hello/
                             #   http://localhost:8000/test/abc/hello/
)

尚、正規表現の使い方は Python の re モジュールに依存しているのでそちらを参照にして下さい。


サイトのトップ URL の指定方法

サイトのトップ(http://localhost:8000/)にアクセスした際に動作させるスクリプトを指定するには以下の様に記述します。

urlpatterns = patterns('',
    (r'^$', script ),
)


これで Chapter 3 その1 は終了です。

Next --> Chapter 3 その2

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090802

2009-08-01

[] 「Django Book」をやってみる 導入編 20:15  「Django Book」をやってみる 導入編 - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる 導入編 - nelnal@python

Django を始めてみようと思って本とか色々と検討したのだが、結局ネットにあった""Django Book""というのをやってみることにした。

Django Book
http://www.djangobook.com/en/2.0/

日本語訳のものもあったが、どうやら途中の様なので英語版の方で頑張ってみることにする。

Django の利便性

  1. 動作確認をする段階では別にサーバーを用意する必要が無い(Pythonサーバ機能を利用する)。
  2. 大規模なDB環境が不要なのであれば SQLite を使用すれば良い(SQLite のデータはファイル形式なので管理が楽)。
  3. 管理ツールが非常に使いやすい(らしい)。
  4. その他のWebフレームワークと同等の機能はある。

[] 「Django Book」をやってみる Chapter1: Intoroduction to Django 19:34  「Django Book」をやってみる Chapter1: Intoroduction to Django - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる Chapter1: Intoroduction to Django - nelnal@python

フレームワークの利便性の解説。

特に設置・利用についての重要な説明はないので省略


[] 「Django Book」をやってみる Chapter2: Getting Started 19:34  「Django Book」をやってみる Chapter2: Getting Started - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる Chapter2: Getting Started - nelnal@python

Python のバージョンの確認

まず最初に Django を使用する為の環境があるかどうか確認します。

Django の実行には Python 2.3 以上の環境が必要なので Python のバージョンを確認します。

バージョンの確認には Python の起動をするのが一番手っ取り早いです。

(下記は MacOSX 10.5.7 で実行。以降も同様)

$ python

'import site' failed; use -v for traceback

Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)

[GCC 4.0.1 (Apple Inc. build 5465)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>>

もし、Pythonが入ってないようであればインストールしてください。


Django フレームワークダウンロードしてインストール

Django の本家ページから Djangoモジュールダウンロードします。

Django Project
http://www.djangoproject.com/

ちょうど7/29に Version 1.1 が出ているのでそれを使ってみることにします。


まずは解凍して、その後インストールを行います。

$ tar zxvf Django-1.1.tar.gz

'''(省略)'''

$ sudo python setup.py install

'''(省略)'''

$

尚、Windows の場合は 7-Zip などで解凍して、

setup.py が置かれているフォルダで「python setup.py install」と入力して実行してインストールをします*1


インストールが済んだらモジュールがちゃんと呼び出せることを確認します。

$ python

'import site' failed; use -v for traceback

Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)

[GCC 4.0.1 (Apple Inc. build 5465)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import django

>>> django.VERSION

(1, 1, 0, 'final', 0)


また「django-admin.py」が実行出来ることも確認します。

$ django-admin.py help

コマンドが見つからない などのメッセージが出た場合は、django-admin.py のあるフォルダを環境変数 PATH に追加する。

MacOSの場合は /usr/local/bin に、Windows の場合は '''(Pythonインストールパス)'''/Scripts にある。



DBの設定について

ここでは SQLite を使用する予定なのでここでは特に説明しません。省略。



プロジェクトの作成

それではテストプロジェクトを作成します。

django-admin.py の startproject コマンドを実行します。

$ django-admin.py startproject mysite


上記コマンドを実行するとコマンドを実行したディレクトリに「mysite」というディレクトリが作成されます。

ディレクトリの中には4つのファイルが作成されています。

  • mysite/
    • __init__.py
    • manage.py
    • settings.py
    • urls.py

__init__.py
mysite ディレクトリの中身をパッケージとして認識させるのに必要なファイル。中身は空。
manage.py
プロジェクトで様々な処理を実行する為のユーティリティプログラム
settings.py
プロジェクトの設定情報(DB関連、参照モジュール、参照テンプレート)を記述するファイル。
urls.py
プロジェクト以下のURLの管理をする為の設定ファイル。

開発用サーバーを起動する

開発用サーバーで mysite を起動します。

$ cd mysite

$ python.py manage.py runserver

サーバーを起動したら http://localhost:8000/アクセスして、正常に動作していることを確認しましょう。

「It Worked!」の表示が出ればOK。


尚、使用するポートを変更したい場合は以下の様に起動します(以下は Port 8080 を使用したい場合)。

$ python manage.py runserver 8080

また、ローカルネットワーク上で公開したい場合はIPアドレスも一緒に指定します。

$ python manage.py runserver 192.168.XXX.XXX:8080



Chapter 2 はここまで。

Next --> Chapter 3 その1

*1環境変数 PYTHONPATH が設定されてなければいけない

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090801

2009-04-17

setup.py : 自分で標準的に使っている内容 14:34  setup.py : 自分で標準的に使っている内容 - nelnal@python を含むブックマーク はてなブックマーク -  setup.py : 自分で標準的に使っている内容 - nelnal@python

# -*- coding: utf-8 -*-

from distutils.core import setup
import os
import py2exe

py2exe_options = {
                  'compressed' : 1,
                  'optimize' : 2,
                  'bundle_files' : 2
                  }

setup(
      options = { 'py2exe': py2exe_options },
      windows = [ { 'script' : r'test.py' } ],
      data_files = [ ('', [ 'ReadMe.txt' ] ) ],
      zipfile = None )
  • test.pyプログラム実行ファイル
  • ReadMe.txt が入っているのは dist/ 以下にコピーするファイルを記述する箇所


[] vim の ftplugin/python.vim への追記内容 14:24  vim の ftplugin/python.vim への追記内容 - nelnal@python を含むブックマーク はてなブックマーク -  vim の ftplugin/python.vim への追記内容 - nelnal@python

setl fileencoding=utf-8         " file encoding
setl autoindent                 " 自動インデント
setl textwidth=80               " 文字数/行
"setl smartindent                " 高度なインデントを行う
"smartindent より cindent の処理の方が厳密 
setl cinwords=if,elif,else,for,while,try,except,finally,def,class
setl tabstop=4                  " タブ幅
setl expandtab                  " タブ入力時にスペースで置換する
setl shiftwidth=4               " インデントの各段階に使われる空白の数
setl softtabstop=4              " <Tab>, <BS>を使用して編集する際の<Tab>の対応する空白の数
setl smarttab                   " 行頭で<Tab>を押した時に shiftwidth に対応して空白を挿入する

nmap <C-l> >>
nmap <C-h> <<
imap <C-l> <ESC>>>A
imap <C-l> <ESC><<A
imap <C-w> <ESC><C-w>

setl makeprg=python\ -c\ \"import\ py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
setl efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m

command! Python call s:Python()
nmap <F5> :Python<CR>

function! s:Python()
    :w
    :!python %
endfunction

command! PyChecker call s:PyChecker()
nmap <F4> :PyChecker<CR>

function! s:PyChecker()
    :w
    :!pyChecker %
endfunction
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090417

2009-04-02

[] 挿入モード中に dedent(indent の逆)をする 16:39  挿入モード中に dedent(indent の逆)をする - nelnal@python を含むブックマーク はてなブックマーク -  挿入モード中に dedent(indent の逆)をする - nelnal@python

以下の様に設定をした。

:imap (任意のキー) <ESC><<a

ついでにインデントする場合も欲しいので逆も追加

:imap (任意のキー) <ESC>>>a

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090402

2009-04-01

[] 自分の基本ログ設定 14:55  自分の基本ログ設定 - nelnal@python を含むブックマーク はてなブックマーク -  自分の基本ログ設定 - nelnal@python

処理開始箇所

logging.basicConfig( level=logging.DEBUG, format=LOGFORMAT,
                     filename=LOGFILENAME, filemode="w" )
「LOGFORMAT」の中身
LOGFORMAT = "%(asctime)s %(levelname)s " + \
            "[ %(module)s:line %(lineno)4s ] > %(message)s"
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090401

2009-03-17

[] python 開発環境を考える 16:28  python 開発環境を考える - nelnal@python を含むブックマーク はてなブックマーク -  python 開発環境を考える - nelnal@python


今まで python の開発を Eclipse + PyDev で行ってきたのだが、最近よく落ちる様になっりました。

あまり細かいところまで調査していないので分からないがどうもメモリの空き容量に原因がある気がしてます。

なぜならアプリを目一杯開いている時に落ちる(というか突然ウィンドウが無くなってる)という

状況になっていたからです。


しばらく我慢して使ってきたのだが、最近どうにも耐えられなくなったので

色々とエディタを検討してみることにする。


自分としての希望は以下の通り


Eclipse + PyDev

EclipsePython 開発用に拡張した統合開発環境。割と使えます。

ただし、自宅環境では問題なく使えるが会社環境のメモリ制約で今回降格処分にあいなりました。


メリット

ただし、CPUやメモリの制約がなければ比較的快適な環境だと思います。

  • 結構便利なコード入力支援機能
  • 構文チェックしてくれる(ただし簡単なもの)
  • より細かいチェックとして pylint が使える
  • キーバインドEmacsがある。
  • プロジェクト管理出来る

デメリット

やはりリソースに余裕が必要と言ったところか。

あと、気付かない内にウィンドウが無くなってるのはどうなのよ。



Pyscripter




SPE(Stani's Python Editor)

Python で作られた Python 開発環境。

色々と


一般的なエディタ (Python の Syntax カラー対応)

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090317

2009-03-04

構文チェッカーの導入 11:38  構文チェッカーの導入 - nelnal@python を含むブックマーク はてなブックマーク -  構文チェッカーの導入 - nelnal@python

正直、今まで python プログラムを実行する方法以外で、

構文チェックしようなんて考えは全くありませんでした。

結構走査中が長いプログラムとか作ってるので、問題が見つかるまで時間が掛かってたんですよねぇ。

ま、自分の例外回避処理の書き方にも大いに問題があるとは思いますが・・・。

ということでさっそく導入することにしました。


構文チェッカーとしては PylintPyChecker が2強の模様です。

自分は Eclipse + PyDev で pythonプログラムを書いており、

PyDev の設定項目があることから Pylint の方を導入することにしました。


Pylint の導入


Pylint の実行に必要なのは3つのライブラリ

の各ライブラリ


各々のファイルをダウンロードし、回答したら、setup.py のあるディレクトリ

$ python setup.py install

と実行すればインストールされます。

3つともインストールが完了すれば準備OK。


PyDev の設定

Eclipse + PyDev の環境で Pylint を使用する場合には、

Eclipse から設定を追加する必要があります。


以下の設定手順は Pleiades プラグイン(http://mergedoc.sourceforge.jp/pleiades.html)導入下 での設定方法です。


  1. 「ウィンドウ」 -> 「設定」 で「設定」ダイアログを開く
  2. ツリーメニューの「PyDev」項目下に「Pylint」の項目があるのでそれを選択
  3. 「Pylintの使用」にチェックを入れる。
  4. 「pylint のロケーション (lint.py)」にインストールした pylint ライブラリ内にある lint.py までのパスを入力する*1

これらを設定すれば、EclipsePythonモジュールを変更・セーブした際に

Pylint が自動的に動くようになうようです。


が・・・。



Pylint が動かない

pylint の実行で失敗しました。

恐らくライブラリの問題っぽい。

先々役に立たなくなる情報とは思いますが、一応メモ。


実行環境は以下の通り

  • Windows XP SP3
  • Eclipse ver. 3.4 + PyDev 1.3.24
  • CPython ver. 2.5.4
  • pylint ver. 0.16.0
  • logilab-common ver. 0.38.1
  • logilab-astng ver. 0.17.4

以下が、エラーメッセージ

Pylint: Executing command line:' D:\Python25\Lib\site-packages\pylint\lint.py --include-ids=y D:\workspace4cosmos\DesignPattern\src\Builder.py 'Pylint: The stdout of the command line is: Pylint: The stderr of the command line is: Traceback (most recent call last):
  File "D:\Python25\Lib\site-packages\pylint\lint.py", line 31, in <module>
    from pylint.checkers import utils
  File "D:\Python25\Lib\site-packages\pylint\checkers\__init__.py", line 40, in <module>
    from logilab.astng.utils import ASTWalker
  File "D:\Python25\Lib\site-packages\logilab\astng\__init__.py", line 256, in <module>
    List._proxied = MANAGER.astng_from_class(list)
  File "D:\Python25\Lib\site-packages\logilab\astng\manager.py", line 191, in astng_from_class
    modastng = self.astng_from_module_name(modname)
  File "D:\Python25\Lib\site-packages\logilab\astng\manager.py", line 142, in astng_from_module_name
    return self.astng_from_module(module, modname)
  File "D:\Python25\Lib\site-packages\logilab\astng\manager.py", line 176, in astng_from_module
    from logilab.astng.builder import ASTNGBuilder
  File "D:\Python25\Lib\site-packages\logilab\astng\builder.py", line 40, in <module>
    from logilab.common.fileutils import norm_read
  File "D:\Python25\Lib\site-packages\logilab\common\fileutils.py", line 25, in <module>
    from logilab.common.shellutils import find
  File "D:\Python25\Lib\site-packages\logilab\common\shellutils.py", line 23, in <module>
    from logilab.common.proc import ProcInfo, NoSuchProcess
  File "D:\Python25\Lib\site-packages\logilab\common\proc.py", line 119, in <module>
    from signal import SIGKILL, SIGUSR2, SIGUSR1
ImportError: cannot import name SIGKILL

色々と調べてみたところ、pylint を構成している logilab-common の中で

from signal import SIGKILL, SIGUSR2, SIGUSR1

としているみたいだが、CPython 2.5.4 の signal モジュールを調べてみると

>> import signal
>> dir( signal )
['NSIG', 'SIGABRT', 'SIGBREAK', 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_IGN', '__doc__', '__name__', 'default_int_handler', 'getsignal', 'signal']
>> 

となり、signal モジュール内に「SIGKILL」という名前は存在していないようです。

尤もこれは Windows 用の Python の signal モジュールだからこうなるわけで、

LinuxUnixPython には SIGKILL があります。


一応問題箇所は Windows 用の回避を目的として書かれている様ですが、どうにも回避できていないようです。

Logilab の logilab-common の障害報告でも似たような問題(「SIGXCPU」がない)が提起されていましたが、

SIGXCPU の問題は回避できている用ですが、SIGKILL の問題については現在も残ったままの模様です。

*1:setup.py install で導入していれば \Lib\site-package 内に pylint ディレクトリがあるはず

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090304

2008-04-30

[] constモジュール 16:48  constモジュール - nelnal@python を含むブックマーク はてなブックマーク -  constモジュール - nelnal@python

Python クックブックの「6.2 定数を定義する」に const モジュールが記述されている。

で、他のクラスのアトリビュートに対しても const モジュール内の _const クラスが利用したくなり、

チョット改変した。


下から3行が改変部分。

# -*- coding: utf-8 -*-

class _const( object ):
    class ConstError( TypeError ): pass
    def __setattr__( self, name, value ):
        if hasattr( self, name ):
            raise self.ConstError, "Can't rebind const(%s)" % name
        else:
            self.__dict__[ name ] = value

    def __delattr__( self, name ):
        if hasattr( self, name ):
            raise self.ConstError, "Can't unbind const(%s)" % name
        raise NameError, name

import sys
inst = _const()
inst.Const = _const
sys.modules[ __name__ ] = inst

これによって、

import const

class Test( const.Const ):
    pass

ってな感じで使えます。

まぁ、ちょっとは役に立ちます。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080430

2008-04-24

[][] COMオブジェクトの定数を使用したスクリプトを py2exe で固める。 17:06  COMオブジェクトの定数を使用したスクリプトを py2exe で固める。 - nelnal@python を含むブックマーク はてなブックマーク -  COMオブジェクトの定数を使用したスクリプトを py2exe で固める。 - nelnal@python

pywin の win32com.client を使用する際に

定数は win32com.client.constants.*** などという形で記述すれば使用できる。


Excelだったら

import win32com.client

として、

range.End( win32com.client.constants.xlDown ).Row

などと使用すれば良い*1


これで、*.py の拡張子で実行するスクリプトの場合は問題ないのだが、

そのまま py2exe で固めて実行したところ、

AttributeError: xlToRight

と言われてしまった。

そこで色々と検索してみたところ全く同じケースについてこちら(py2exe Wiki)にあったので試してみた。


結果としてはリンク先の Solution 1 の解決方法(setup.pyの記述で対応)する方法は上手く行かなかった*2

そこで、暫定的にだが Solution 2 の解決方法で対応している。


1. コマンドラインで以下を実行

> python makepy.py -o (出力ファイルのパス)

2. ウィンドウが開いて対応するCOM オブジェクトライブラリについて聞かれるので、使用したいものを選択

3. ファイルが出力されるので、それを使用したい自分のスクリプトから読めるように適当なパスに配置

4. 使用するスクリプトファイルで作成したファイルを import し、使用する*3


これで解決できたわけだが、出来れば py2exe の setup.py で対応したいなぁ。

*1:ここではかなり省略しているが、range = Worksheet( 1 ).Range("A1") 等と考えてもらえれば良い

*2:色々と粘ってみたのだが

*3:constants = (出力ファイル).constantsなどとするとより使用しやすい

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080424