CALENDAR

2010年9月
« 7月    
 12345
6789101112
13141516171819
20212223242526
27282930  

CATEGORIES

ARCHIVES

あわせて読みたい

  • LOADING...

vars, locals, globals + Python

スコープに含まれる変数を要素とする辞書を戻す関数メモ。

テストプログラムを書く

$ vi vars.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
g_name = "tarou"
g_color = "red"
 
def func():
	name = "jirou"
	color = "blue"
	print "-"*10, "In function.", "-"*10
	print "vars ->", vars()
	print "locals ->", locals()
	print "globals ->", globals()
	print "name:%(name)s, color:%(color)s" % vars()
 
if __name__ == "__main__":
	func()
	print "-"*10, "In __main__.", "-"*10
	print "vars ->", vars()
	print "locals ->", locals()
	print "globals ->", globals()
	print "name:%(g_name)s, color:%(g_color)s" % vars()

実行してみる

$ python vars.py 
---------- In function. ----------
vars -> {'color': 'blue', 'name': 'jirou'}
locals -> {'color': 'blue', 'name': 'jirou'}
globals -> {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'vars.py', 'func': <function func at 0x5e2f0>, 'g_name': 'tarou', '__name__': '__main__', 'g_color': 'red', '__doc__': None}
name:jirou, color:blue
---------- In __main__. ----------
vars -> {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'vars.py', 'func': <function func at 0x5e2f0>, 'g_name': 'tarou', '__name__': '__main__', 'g_color': 'red', '__doc__': None}
locals -> {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'vars.py', 'func': <function func at 0x5e2f0>, 'g_name': 'tarou', '__name__': '__main__', 'g_color': 'red', '__doc__': None}
globals -> {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'vars.py', 'func': <function func at 0x5e2f0>, 'g_name': 'tarou', '__name__': '__main__', 'g_color': 'red', '__doc__': None}
name:tarou, color:red

雑感

“%(name)s” % (vars()) って記述がわかりやすい。

パッケージインポート

Python のパッケージインポートについてメモ。

パッケージインポートとは?

ディレクトリパスを指定してインポートを行う機能のこと。
モジュールサーチパスに指定するディレクトリが減らせたりできる。

__init__.py

インポート対象ディレクトリに必要なファイル。
初回インポート時にロードされる。

インポートしてみる1

まずテスト用のディレクトリとファイルを作成する。
構成は以下のようにする。

a.py
mod/b.py
mod/__init__.py

インポートしてみる2

mod ディレクトリを作成し、中に b.py ファイルを作成。

$ mkdir mod
$ vi mod/b.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
# b.py
def show_test():
        print "in b.show_test()"
 
print "in b.py"

続けて __init__.py を作成。

$ vi mod/__init__.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
# __init__.py
print "in __init__.py"

a.py ファイルを作成。

$ vi a.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
# a.py
import mod.b as b
 
if __name__ == "__main__":
        b.show_test()

実行してみる

$ chmod +x a.py
$ ./a.py
in __init__.py
in b.py
in b.show_test()

雑感

知らなくても支障はないけど、知ってると便利。

.python-eggs + 環境変数

.python-eggs でちょっとハマったメモ。

MySQL-python を使うとき .python-eggs が作成されるのだけど、
デフォルトでは、自分のホームディレクトリ下に作成される。

なので、例えば下記のように別ユーザーでスクリプトを実行させた場合、
実行ユーザーのホームディレクトリに書き込み権限がない為、エラーが発生する。

$ sudo -u hoge ./script.py
import MySQLdb がうんたらエラー!
.python-eggs パーミッションデニード!!

なんとかする

自分のホームディレクトリに他人の書き込み権限を加えてみる。

一応は、解決される。
けど、自分のホームディレクトリに他人の書き込み権限はつけるなんてもってのほか。

てことで、

なんとかする2

.python-eggs の書き込み先を別の書き込み権限のある箇所に変更する。

.python-eggs の書き込み先は、以下の環境変数に設定することで変更可能。

import os
os.environ['PYTHON_EGG_CACHE'] = '/usr/local/foo/.python-eggs'

うん。これが無難なんじゃあるまいか。

いやしかし、意外とハマッた。