Python」タグアーカイブ

Python で “error: Unable to find vcvarsall.bat” が出た場合。


どうもみむらです。

今回は Windows で Python 使ってて、
setup.py install とかしたときに、 “error: Unable to find vcvarsall.bat” とか出た場合について。

下記のウェブサイトにて記述を見つけたのですが、一応自分向けのメモとして書き直し。
街角のリブロガー pythonでvcvarsall.batエラーが出る。



1.使っている Python のビルドされた環境を確かめる。

起動直後に現れる “MSC v.1500” というような表記からバージョンを判定しても良いのですが、
( Visual Studio を使っている人なら分かるかも・・? )

次のコードを実行して判定します。

from distutils.msvccompiler import *
get_build_version()

出力結果に “9.0” や “10.0” と出るかと思います。

 

2.レジストリに値を書き込む

値を次の場所に書き込みます:

キー名: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\(Python の MSVC のバージョン)\Setup\VC
値名:ProductDir
値:(現在使っている Visual Studio の VC フォルダへのパス)

 

例として、私の環境で使っている Python 2.7 が MSVC 9.0 環境でビルドされており、
一方で私自身は Visual Studio 2013 を使っています。

この場合値は次のようになります:

キー名: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VC
値名:ProductDir
値:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC

image

 

また、1で 10.0 と出た場合は、
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VC に。

その他 x86 (32bit) 環境の場合は、
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC になって、
パスも C:\Program Files\Microsoft Visual Studio 12.0\VC
等になるかと思います。

・・取り急ぎ、メモ。

Python の内包表現と演算子と。


みむらです。

最近ちょっと Python を触ってみようかとということで、
しばらくぶりに触っています。

ってことで忘れそうなことのメモ。

・・・Python をよく使っている人からするとぶん殴られそうな気がしますが、
とりあえず、勉強ということで躓いたところをメモしていきます。

 

内包表現:

[追加要素 for 変数 in リスト if 条件]

使い方としては、

l = ((0,1),(2,3),(4,5))
m = [i for (i,j) in l]
>> (0,2,4)

みたいな。

なんとなく、C# だと、

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Select(i => i[0]);

みたいな感じ・・ですかね。

あとは条件式を加えて、

[i for (i,j) in l if i > 0]

みたいなやつに関しては

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Where(i => i[0] > 0).Select(i => i[0]);

みたいな感じ。

 


演算子のメモ:

割り算において “/” と “//” 演算子があって、

3.0/2.0 = 1.5
3.0//2.0 = 1.0

というように、”//” 演算子だと結果が整数に丸められる。

丸め方としては、
math.floor で丸めた時と同じ動作となるっぽい。

1.5 → 1.0
-1.5 → -2.0

考え方としては「負の無限大」方向に丸める。
データとして考えるなら、 0x0 の方向に丸める、と考えると良いのかもしれない。
(負数は2の補数表現で表現されることを考えてみると。)

逆に、 “0” 方向に丸める場合は、 int で括ると良い感じ。
ex. int(1.5 / 1.0)

1.5 → 1.0
-1.5 → –1.0

あとは round 関数で丸める方法なんてのもありますが、
これは昔書いた「銀行丸めと四捨五入。」を参照してください。

 

それと、 “**” 演算子が存在し、
これは C# で言うところの Math.Pow (べき乗計算)に該当。

ex.)
2**10 = 1024


要素数を数える:

私自身、ちょっとはまったのですが・・(汗

C++ だと hoge.size() とか書いて、
C# だと hoge.Length だったり、動的に求める必要がある物については hoge.Length() だったり。

Python の場合は、 len(hoge) で求まる。

また、 hoge.count() と叩くと「引数が足りない!」と怒られるんですが、
これは C# の hoge.Count(1) と同じで、要素内に指定されたものがいくつ入っているかを返すメソッド。

ただし、C# の hoge.Count() のように、引数なしだと要素数が返ってくるということはなく、
「引数が足らない!」としかられるだけなので注意。

Python + Django してみた。 MTV Model について


どうも書いてて、 MVC っぽいようで、MVC っぽくないので調べてみると、

FAQ 全般 — Django v1_0 documentation
http://djangoproject.jp/doc/ja/1.0/faq/general.html

ここいはく、 Model – Template – View ということで、 MTV モデルというんだそうな。

MVC モデルでは、

Model : データとデータに対する手続きを記述。
View : Model のデータをユーザが見られるように表示する。UI への出力。
Controller : ユーザの入力に対して応答する。処理が必要なら Model に依頼し、表示が必要なら View に依頼する。

http://ja.wikipedia.org/wiki/Model_View_Controller

という感じなのですが、

Django を MVC として見ようとすると、
個人的に View のロジックと表現技法が分離されていない印象をうけて、
Controller もDjango 全体をさすようにに見えて、どうも本来扱う部分を超えてしまう。

というように私には見えてしまってしょうがない感じだったのです。

 

そこで、
最初に示したページにある、 MTV モデルに合わせて考え直してみると、かなりしっくり来て、

Model : Database に格納してあるデータ、および付随する処理(models.Model より提供)
Template : テンプレートファイルによってデザインされた各ページのデザイン
View : リクエストがあった URI ごとに、どのページを見せるかを記述する処理。

ということで、Django を MVC として見て、脳内に疑問符が浮かんだ方は、
公式ウェブサイトで提唱されている、MTV モデル、つまり、
View を Template そして Controller を View とすることで、
Django の設計思想がモデルとしてばしっと来るのではないでしょうか。

Python + Django してみた。 その4.データベース。


体力が切れてきた。やばい。みむらんです。

データベースを使ったサンプルってことで、何かやろうかと思ったのですが、
小さいものが見当たらないので、使い方だけ。

参照 : http://djangoproject.jp/doc/ja/1.0/topics/db/queries.html

 

1.models.py でモデルを定義しよう

Entry クラスにぼこぼこ書くだけで定義完了です。

class Human(models.Model):
    name = models.CharField(max_length=12)
    description = models.TextField()
    age = models.IntegerField()

たとえば、人の名前を管理するなら、こんな感じでしょうか。

name CharField(max_length=12) 最長12文字の文字列
description TextField() 文字列
age IntegerField() 数字

 

2.データベースへの反映

settings.py に、各種設定を済ませておきます。

変数名 設定内容
DATABASE_ENGINE データベースエンジン ‘mysql’ / ‘sqlite3’ など
DATABASE_NAME データベース名 ‘human_db’
DATABASE_USER ユーザ名 ‘mimuran’
DATABASE_PASSWORD パスワード ‘hogehoge’
DATABASE_HOST サーバホスト名 ‘example.com’
DATABASE_PORT ポート番号 ‘1234’

 

一通り済ませたら、

$ ./manage.py syndb

で、実データベースに反映します。

 

3.データの読み書き

書き込み:

data = Human()
data.name = u'みむらん'
data.age = 19
data.description u'ぱいそんよくわかってない系だんし'
data.save()

インスタンスを生成して、ごにょごにょ詰め込んだ後、 save メソッドを呼び出して保存。

すべて読み出し:

all = Human.objects.all()

条件を付けて読み出す:

mimuran = Human.objects.filter(name=u'みむらん')

とりあえず、こんな感じで。

Python + Django してみた。 その3.テンプレート使ってみた。


ども、みむらんです。
第2回の続きってことで。

 

1.テンプレートとなる HTML ファイルを書く。

test_project ディレクトリ以下に templates/test_app ディレクトリを作成し、
templates/test_app ディレクトリ以下に home.html を以下の内容で作成します。

<html>
<head>
<title>{{title}}</title>
</head>
<body>
{% for i in data %}
{{i}}<br/>
{% endblock %}
</body>
</html>

{{変数}} というのを、「テンプレート変数」と呼び、
{{% タグ 引数 %}} ~ {{% end タグ %}} というのを、「タグ」と呼びます。

テンプレート変数の記述を用いて、変数の中身を表示させ、
タグの記述を用いて表示上の処理を記述する形となります。

Django テンプレート言語 — Django v1.0 documentation
ぱーっとこのページを見ていた感じでは、以下の要素がよく使われそうな気がします(ぉ

タグ名

利用用途

extends [template file] すでに定義されているテンプレートファイルを継承する。
Java での extend と同義と捉えられるかも。
block [block name] 継承元:ブロック(範囲)を定義し、継承先で値が変更される場所を設定する。
継承先:事前にブロックとして定義されている範囲のテキストを変更する。
for [val1] in [val2] val2 から要素を1つ1つ取り出し、 val1 に格納する形で、
for ~ endfor 間を繰り返す。
Java で言うところの foreach がこれに該当。
ちなみに、 Python の for は全て foreach な処理になっている。
if [条件] ~ else ~ endif
ifequal [val1] [val2] ~ endifequal
ifnotequal [val1] [val2] endnotequal
条件が真であれば、該当範囲が実行される。通常の if 条件と同じ。
ifequal は2つが等しい場合。
ifnotequal は2つが等しくない場合にそれぞれ実行される。

 

2.settings.py にテンプレートが置かれているディレクトリのパスを記述する。

TEMPLATE_DIRS = (
)

こうなっている部分があるかと思いますが、ここを下記のように書き換えます。

TEMPLATE_DIRS = (
   '[test_project までの絶対パス]/templates',
)

([test_project までの絶対パス] には、それぞれの環境に合ったパスを記述してください。)

 

3.views.py を編集する。

test_app に移動し、views.py を以下のように書き換えます。

from django.http import HttpResponse
from django.template import loader, RequestContext

def home(req):
    contexts = RequestContext(req, {
        'title' : 'hello django!',
        'data' : ('Hello', 'django', 'world'),
    })
    template = loader.get_template('test_app/home.html')
    return HttpResponse(template.render(contexts))

 

4.実行する。

image