Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

python

cygwin上にSphinxをインストール

Cygwin 上に Sphinx をインストールしたときのメモです。

python の pip がインストールされていない場合はインストールしておきます。

 

pip コマンドを使って Sphinx をインストール

$ pip install sphinx
Downloading/unpacking sphinx
  Downloading Sphinx-1.2.2.tar.gz (3.1MB): 3.1MB downloaded
  Running setup.py egg_info for package sphinx

    no previously-included directories found matching 'doc/_build'
Downloading/unpacking Pygments>=1.2 (from sphinx)
  Downloading Pygments-1.6.tar.gz (1.4MB): 1.4MB downloaded
  Running setup.py egg_info for package Pygments
~ 省略 ~
    building 'markupsafe._speedups' extension
    gcc -fno-strict-aliasing -ggdb -O2 -pipe -fdebug-prefix-map=/home/jt/rel/python-2.7.3-1/python-2.7.3-1/build=/usr/src/debug/python-2.7.3-1 -fdebug-prefix-map=/home/jt/rel/python-2.7.3-1/python-2.7.3-1/src/Python-2.7.3=/usr/src/debug/python-2.7.3-1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/include/python2.7 -c markupsafe/_speedups.c -o build/temp.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.o
    gcc -shared -Wl,--enable-auto-image-base -L. build/temp.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.o -L/usr/lib/python2.7/config -lpython2.7 -o build/lib.cygwin-1.7.24-i686-2.7/markupsafe/_speedups.dll
Successfully installed sphinx Pygments docutils Jinja2 markupsafe
Cleaning up...

あとは、Sphinxの普通の使い方と同じはず。 sphinx-quickstart コマンドでプロジェクトを適当に作成すれば使えます。

pythonのpipをインストール@cygwin

cygwinのsetuptoolsがインストールされていない場合は、インストールしておいてください。

 

インストールされている場合は、easy_installコマンドが使えるので、確認。

$ easy_install --version
distribute 0.6.34

最新のpipは動かないようなので、1.4.1 をインストールする。 ※ なぜか何回かダウンロードに失敗しました。

$ easy_install https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
Downloading https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
Processing pip-1.4.1.tar.gz
Writing /tmp/easy_install-weNPEp/pip-1.4.1/setup.cfg
Running pip-1.4.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-weNPEp/pip-1.4.1/egg-dist-tmp-Jf26gm
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.rst' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.4.1 to easy-install.pth file
Installing pip script to /usr/bin
Installing pip-2.7 script to /usr/bin

Installed /usr/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg
Processing dependencies for pip==1.4.1
Finished processing dependencies for pip==1.4.1

これで pip コマンドが使えるようになりました。

$ pip help

Usage:   $ pip help

Usage: 
 pip <command> [options]

Commands:
 install Install packages.
 uninstall Uninstall packages.
 freeze Output installed packages in requirements format.
 list List installed packages.
 show Show information about installed packages.
 search Search PyPI for packages.
 wheel Build wheels from your requirements.
 zip Zip individual packages.
 unzip Unzip individual packages.
 bundle Create pybundles.
 help Show help for commands.

General Options:
 -h, --help Show help.
 -v, --verbose Give more output. Option is additive, and can be used up to 3 times.
 -V, --version Show version and exit.
 -q, --quiet Give less output.
 --log <file> Log file where a complete (maximum verbosity) record will be kept.
 --proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port.
 --timeout <sec> Set the socket timeout (default 15 seconds).
 --exists-action <action> Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
 --cert <path> Path to alternate CA bundle.
  pip <command> [options]

Commands:
  install                     Install packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  zip                         Zip individual packages.
  unzip                       Unzip individual packages.
  bundle                      Create pybundles.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output.
  --log <file>                Log file where a complete (maximum verbosity) record will be kept.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               Path to alternate CA bundle.

プログラミングコンテストの模擬練習(ババ抜き)を解いてみた

以下で紹介されていたプログラミングコンテストの模擬練習問題(ババ抜き)をpythonの勉強がてら解いてみた。使ったpythonのバージョンは、2.7.3です。

http://www.gizmodo.jp/2013/12/recruit_programming_contest.html http://recruit-programing-contest-practice.contest.atcoder.jp/tasks/recruite_2013_pre_a

ファイル名 : baba.py

#! /usr/bin/python
# -*- coding: utf8 -*-
import copy

class Person():
    def __init__(self,card):
        self.cardList = list(card)
        self.cardList.pop() # remove \n

    def addCardAndCompare(self,card):
        if card in self.cardList:
            self.cardList.remove(card)
            return True
        else:
            self.cardList.append(card)
            return False

    def pickLeftCard(self):
        card = self.cardList.pop(0)
        return card

    def isWin(self):
        if len(self.cardList) == 0:
            return True
        return False

    def __eq__(self, other):
        if len(self.cardList) != len(other.cardList):
            return False
        for i in range(len(self.cardList)):
            if self.cardList[i] != other.cardList[i]:
                return False
        return True

class TestCase():
    def __init__(self, file):
        self.pickCount = 0
        self.picker = 0
        self.target = 1
        self.Fighters = int(file.readline())
        self.personList = []
        self.personListCopy = []
        self.detectLoop = True
        for i in range(self.Fighters):
            self.personList.append(Person(file.readline()))
        self.personListCopy = copy.deepcopy(self.personList)
        self.fight()

    def checkCardList(self, p):
        self.person = self.personList[p]
        if self.person.isWin():
            self.personList.pop(p)
            del(self.person)
            self.Fighters -= 1
            return True
        return False

    def pickCard(self):
        self.pickCount += 1
        self.card = self.personList[self.target].pickLeftCard()

        if self.personList[self.picker].addCardAndCompare(self.card):
            self.detectLoop = False
        if self.checkCardList(self.target):
            self.detectLoop = False
            if self.target < self.picker:
                self.picker -= 1
        if self.checkCardList(self.picker):
            self.detectLoop = False
        if not self.detectLoop:
            self.personListCopy = copy.deepcopy(self.personList)

    def fight(self):
        while True:
            self.pickCard()
            if self.detectLoop:
                if self.personListCopy == self.personList:
                    print "-1"
                    return 0
            self.detectLoop = True
            self.picker = (self.picker + 1) % self.Fighters
            self.target = (self.picker + 1) % self.Fighters
            if self.picker == self.target:
                if len(self.personList) == 0:
                    print self.pickCount
                    return 0
                if self.personList[0].cardList[0] == 'J':
                    print self.pickCount
                    return 0
                print "-1"

inputFile = open("input.txt", "r")
for i in range(int(inputFile.readline())):
    testCase = TestCase(inputFile)
    del testCase
inputFile.close()

実行には以下の入力ファイルを、input.txt というファイル名で同じディレクトリに置いておく必要があります。

3
3
16372
2746J18
348
4
1234
1234
1234
1234J
5
13645
643125
147
5137J
3245

実行結果

$ ./baba.py 
15
29
-1

もっとスマートの解き方はありそうだが、とりあえず動いてます。

pythonで日本語処理めとめ@python 2.6

python で文字列を扱う場合、unicode型と、str型というのがありますが、これらの扱いが正直大変。初心者が何かとつまずく所だと思いますし、私自身もつまづきましたので、まとめてみました。(間違いあったらご指摘ください)

unicode型とはpythonが独自に扱う文字列型で、str型は通常はutf-8やshift-jisといったある文字コードでエンコードされた文字列型です。文字列を変数に代入する時、普通に代入するとstr型になるが、"u" を文字列の前に付けるとunicode型になります。

(ファイル名study.pyとします)
#! /bin/python
u1=u"これはunicode型です"
print u1

ソースコードをpython独自のunicode型で書くことはできないので、実行時に上記のu1はソースコードの文字コードをunicodeに変換する必要があります。この時、pythonはデフォルトでasciiしか扱えないため、以下のように実行するとエラーになります。

# ./study.py
SyntaxError: Non-ASCII character '\xe3' in file ./study.py on line 6, but no encoding declared; see http://www.python.org/peps/pep-0263.html for detail

これを避けるために用いられるのが、ソースコードの文字コード指定です。これはpythonとしては結構常識ですよね。

#! /bin/python
# -*- coding: utf8 -*-
u1=u"これはunicode型です"
print u1
# ./study.py
これはunicode型です

unicode をutf-8やshifit-jisなどに変換することをエンコード、逆をデコードと呼びます。今自分がどちらの型を扱っているか分からない場合はtype関数で見てみましょう。(ここからは、上記ソースの1,2行目は省略します)

u1=u"これはUnicode型です"
s1="これはstr型です"
print type(u1)
print u1
print type(s1)
print s1
# ./study.py
<type 'unicode'>
これはUnicode型です
<type 'str'>
これはstr型です

このようなソースの書き方をした場合、print u1 は、unicode から端末の標準出力の文字コード(私の場合はutf-8)に自動で変換されて表示され、print s1 は、s1 の中に入っている文字コードがそのまま出力されます。なので、s1にshift-jisの文字が入っていて、端末の文字コードがutf-8だと文字化けします。

次に、u1とs1と結合してprintしてみます。

u1=u"これはUnicode型です"
s1="これはstr型です"
print u1 + s1

実行すると、

# ./study.py
Traceback (most recent call last):
  File "./study2.py", line 6, in <module>
    print u1 + s1
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

はい。エラーになります。これは、ptyhonは結合時に一端s1をunicodeにデコードしようとするのですが、デフォルトではascii文字列しかデコードできないため、エラーになるのです。これがめちゃくちゃ分かりづらい。ソースコードや標準出力の文字コードは自動で変換してくれるのに、内部の文字コード変換は自動でやってくれないのです。よって、以下のように手動でs1の中身はutf-8ですよとpythonに教えて、デコード(unicodeに変換)する必要があります。

u1=u"これはUnicode型です"
s1="これはstr型です"
print u1 + s1.decode('utf-8')
# ./study.py
これはUnicode型ですこれはstr型です

無事表示されました。もしくは、結合する文字列を全てstr型にそろえれば、unicode への変換が必要ないので、u1を予め手動でエンコード(utf-8に変換)しても正常に処理できます。

u1=u"これはUnicode型です"
s1="これはstr型です"
print u1.encode('utf-8') + s1
# ./study.py
これはUnicode型ですこれはstr型です

エンコードの文字コードを間違えてもpythonはstr型をそのまま出力するだけなので、文字化けします。

u1=u"これはUnicode型です"
s1="これはstr型です"
print u1.encode('shift-jis') + s1
# ./study.py
?????Unicode?^???これはstr型です

いちいち面倒だなと思う場合は、pythonのデフォルトエンコーディングをutf-8にしてしまう方法もありです。ただ、デフォルトを変えてしまうので、システムが大きいと思わぬ所で不具合が出る可能性があるので注意が必要です。

import sys
reload (sys)
sys.setdefaultencoding('utf-8')

u1=u"これはUnicode型です"
s1="これはstr型です"
print u1 + s1
# ./study.py
これはUnicode型ですこれはstr型です

ちなみに、setdefaultencoding()は、実行準備完了時に削除される関数らしいので、再度呼び出したい場合はreloadをする必要があります。 もしくは、行頭の #! /bin/python を #! /bin/python -S に変更すれば、reloadは必要なくなるようです。 自分で書くちょっとしたプログラムなら、この方法が一番楽ちんそうですね。

 

py2exeでpythonをWindowsの実行ファイル形式にする@Windows 7 64bit

python でちょこっと作プログラムを誰かに渡したいとき、相手にpython入れてもらうの面倒なので、Windowsの実行ファイル化できないか調べてみたらありました。py2exe というツールです。

インストールは簡単です。python (windows版) を事前にインストールしておけば、py2exe のインストーラがそのフォルダに自動的にインストールしてくれます。

後は、作ったpythonをexe化するためのプログラムを書きます。プログラムといっても大したものではなく、以下のこれだけで、例えばsetup.pyという名前で作るとします。自分の作ったプログラムはmyprogram.pyという名前とします。

# setup.py の中身
from distutils.core import setup
import py2exe

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

setup(
 options = {"py2exe": py2exe_options},
 console = [
 {"script" : "myprogram.py"}],
 zipfile = None)

最後にこれを実行します。実行時は引数に"py2exe"を渡す必要があります。

> setup.py py2exe

実行すると、dist というフォルダができ、その中にmyprogram.exeが出来上がります。

ちなみに、pygtk + Glade で作ったGUIアプリケーションも同様にexe化しようとしましたが、exeファイル化はうまくいったのですが、実行時にエラーが出てうまく動きませんでした。

この辺りのサイトを参考に今度頑張ってみようと思います。

 

参考 http://python.matrix.jp/modules/py2exe/

pythonスクリプトをダブルクリックで起動する→拡張子関連づけ詳細設定@Windows 7 with python 2.7

拡張子 .py を持ったファイルをダブルクリックで起動する方法です。 ※Windows版pythonがすでにインストールされているとします。

まずは、pyファイルを右クリックで、「プログラムから開く」→「既定のプログラムの選択」 を選び、「参照」から、pythonインストール先の"python.exe"を選びます。

しかし!!これだと実行された後にウィンドウがすぐ閉じてしまい、実行結果がわかりません。 実行完了後に実行画面を自動的に閉じない方法はないかとヘルプを覗いてみると、あるじゃないですか。" -i " というオプションです。これ付けると実行完了後、pythonの対話モードに入ってくれるらしいです。

つまり、

# python.exe -i  hoge.py

とやると、

>>>

というプロンプトが出て止まってくれます。これだ!と思いましたが、Windows 7 では、Windows XP のように、拡張子に関連づけられた実行ファイルに渡すオプションを変更することができないようです。

そこで登場するのが、「Default Programs Editor」というフリーソフト。これを使って、.py に関連づけられた python.exe に -i オプションを渡すことができるようになりますのでお試しあれ。

vimでpythonのプラグラムの一部分を一気にインデント追加or削除する

python って、インデントでプログラムの構造を定義しますので、インデントを簡単に追加したり削除したりできると便利ですよね。

一行ならTABを押せばインデントできるのですが、一定の範囲のインデントを変更したい場合は、以下のようにすれば便利です。

まずは、"v" コマンドで、インデントを変更したい範囲をビジュアル指定します。

    aaaa        ←ここの先頭行で"v"を押下
    bbbb
    cccc

カーソルを動かして全体を選択

    aaaa
    bbbb
    cccc

ここで、">" を押すとインデント追加、"<" を押すとインデント削除されます。

vimでpythonの補完を行う

pythonを少し書いてみようと思い立ち、とりあえずvimでpythonのキーワードを補完できるようにしてみました。

補完するには、Pydiction というプラグインを使いますので、zipファイルをダウンロードします。

今回はバージョン1.2を使い、以下のようにインストールしました。

# unzip pydiction-1.2.zip
# mkdir ~/.vim/plugin/
# mkdir ~/.vim/pydiction
# mv pydiction-1.2/python_pydiction.vim ~/.vim/plugin/
# mv pydiction-1.2/complete-dict ~/.vim/pydiction

あとは、vim でプラグインを使用できるようにと、その他もろもろの設定を、~/.vimrc に追記します。

# vi ~/.vimrc
filetype plugin on
autocmd FileType python let g:pydiction_location = '~/.vim/pydiction/complete-dict'
autocmd FileType python setl autoindent
autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
autocmd FileType python setl tabstop=8 expandtab shiftwidth=4 softtabstop=4

あとは、プログラミング中にTABで補完が効きます。

python_pydiction.vim
このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ