[an error occurred while processing this directive]
[an error occurred while processing this directive]
import os
import imp
base = os.path.dirname(os.path.abspath( __file__ ))
my_path = os.path.join(base, "my_python_filename");
my_module = imp.load_source("my_name", my_path);
my_module.hoge()
普通は相対パスで読み込むと思うけど、単に load_source() するだけだと、
ユーザが実行する際のカレントディレクトリからのパスになってしまい、意味がない。
そこで、ファイルが置かれている場所のパス名を取得して、つなげている。
import os
for base,dirs,files in os.walk("."):
for f in files:
target = os.path.join(base, f);
if target.endswith(".pm") or target.endswith(".cgi"):
print 'mv %(x)s %(x)s.temp; nkf -e %(x)s.temp > %(x)s'%{"x":target}
os.system('mv %(x)s %(x)s.temp; nkf -e %(x)s.temp > %(x)s'%{"x":target})
t = 1
for i in range(1000):
t *= 2
d = t * 1.0
while d > 1:
d *= 0.1
if d < 0.1025: print t
結果、始めに 10 と続く数でさえ、10141204801825835211973625643008 まで待たないといけない。
from numpy import finfo, float_ finfo(float_).max
# A = [0] * 1000000 0.028us (マイクロ秒) # A = range(1000000) 0.068us (マイクロ秒) # A=[]; for i in range(1000000): A.append(0) 0.248us (マイクロ秒)ひとつずつappendに比べて、このサイズだと10倍速いですね。
# (Cで) A = (int *)malloc(sizeof(int) * 1000000); for(i = 0; i < SIZE; i++) A[i] = 0; 0.008us (マイクロ秒)さすがにCには余裕で負ける...
t = time.time()
t_str = time.strftime("%Y-%m-%d_%H-%M-%S", t)
fp = open(filename, "w")
fp.seek(size)
でもこれだけだとサイズは変わらないみたい。そこで、seek()した先に1バイトだけ書き込んでみる。
def create_empty_file(filename, size):
fp = open(filename, "w")
fp.seek(size-1)
fp.write('\0')
fp.close()
これで、任意のサイズのファイルを簡単に作る関数ができた。
import mmap, os
def mmap_file(fn):
fd = open(fn, "r")
size = os.path.getsize(fn)
data = mmap.mmap(fd.fileno(), size, access=mmap.ACCESS_READ)
print data[10:20] # ファイルの10-19バイト目を表示する
mmap_file("/tmp/hogehoge")
a in vars()とすればよい。
del aとすると、aという変数を消すことが出来る。
def getStackTrace(e):
'''
get the stacktrace of an immediately
previous exception as a string
'''
err_str = cStringIO.StringIO()
traceback.print_exception(e.__class__, e, sys.exc_info()[2], None, err_str)
return err_str.getvalue()
import pylintで、 Pythonでoption explicitみたく文法チェックしてくれる。
s = "abcdef" print list(s)結果
['a', 'b', 'c', 'd', 'e', 'f']
str = "1a"
i = eval("0X" + str)
print i
A = ["apple", "banana", "carrot"] for a in A: print aとすると順番にapple, banana, carrotが表示されるが、その前に1, 2, 3と番号が振りたい(1 apple, 2 banana, 3 carrotみたいに)とき、普通に考えると順番に増える変数を作る
A = ["apple", "banana", "carrot"] i = 0 for a in A: print i, a i += 1か、ループ変数自体を変える
A = ["apple", "banana", "carrot"] for i in range(len(A)): print i, A[i]だけど、どちらもいまいちすっきりしない。
A = ["apple", "banana", "carrot"] for i,a in enumerate(A): print i, a元々ループ変数が複数あるときは、パターンマッチ的な記述をするとうまくいく。
A = [(1,2), (3,4)]
for i,(x,y) in enumerate(A):
print i, x, y
import copy
class A:
def __init__(self):
self.array = [1,2,3]
self.string = "abc"
def __str__(self):
ret ="{array : ["
for a in self.array:
ret += "%d "%(a)
ret += "], string:%s}"%self.string
return ret
a = A()
copied_a = copy.copy(a)
deepcopied_a = copy.deepcopy(a)
a.array[2] = 5
a.string = "hello"
print "a = ", a
print "copied_a = ", copied_a
print "deepcopied_a = ", deepcopied_a
実行結果。
a = {array : [1 2 5 ], string:hello}
copied_a = {array : [1 2 5 ], string:abc}
deepcopied_a = {array : [1 2 3 ], string:abc}
a.arrayやa.stringを書き換えるとcopied_a.arrayやcopied_a.stringも書き換わってしまいますが、deepcopied_a.arrayや
deepcopied_a.stringは別なものになっているので書き換わりません。
import glob
for f in glob.glob('/etc/*.conf'):
print f
こうすると、条件にマッチするファイルへのフルパスがfに順次入ります。
/etc/pam.conf /etc/ypserv.conf /etc/host.conf /etc/cvs-cron.conf ...
import popen2
import os
p = popen2.Popen3("command_hoge", True)
# Trueを付けると、エラー出力と標準出力を分けて使える
print p.pid
# p.pidに"command_hoge"を実行しているプロセスIDが入っている
p.tochild.write("moi")
# command_hogeの標準入力にmoiと書く
p.fromchild.read(100)
# command_hogeの標準出力を100バイト読む
p.childerr.read(100)
# command_hogeのエラー出力を100バイト読む
os.kill(p.pid, 9)
# popenしているプロセスをkillする
popenしたプロセスは、正しくpcloseしなければいけません。
…といっても、Pythonにpcloseはありません。かわりに全てのファイルディスクリプタを閉じて、wait()を呼びます。
import popen2
p = popen2.Popen3("bash", True)
# 相手(popenされたプログラム)にとってのstdinを閉じる (EOFを送る)
p.tochild.close()
# 相手(popenされたプログラム)が何も出力していなければ、
# 閉じなくてもブロックしないかもしれないけど、
# 一応礼儀として閉じましょう。
p.fromchild.close()
# こっちも。
p.childerr.close()
# これでdefunctになった子プロセスを回収する
p.wait()
import random
def getOrdering(n):
A = []
B = range(n)
for i in range(n):
index = int(random.random() * (n-i))
A.append(B.pop(index))
return A
getOrdering(10)
import random
def pickSome(list, n):
retlist = []
picklist = list[:]
imax = min(n,len(picklist))
for i in range(imax):
index = int(random.random() * len(picklist))
retlist.append(picklist.pop(index))
return retlist
使い方。
A = range(7) print pickSome(A, 10)
>>> A=[3, 4, 2, 0, 5] >>> A.sort(lambda x,y: cmp(x, y)) >>> A [0, 2, 3, 4, 5]
A= ["1", "2", "-1"] B = map(string.atoi, A)これでB = [1, 2, -1]になります。
C = map(lambda(x): x*x, B)C=[1,4,1]となります。
>>> s1 = "1;2;345;"
>>> A=s1.split(";")
['1', '2', '345', '']
>>> "#".join(A)
'1#2#345#'
連結する方ですが、セパレータの文字列のメソッドの引数に配列を入れます。
import os,time
child = os.fork()
if child == 0:
print "I'm a child"
time.sleep(3)
else:
print "I'm a parent"
os.wait()
print "Joined"
対話式のシェルで迂闊に
>> os.fork()って打つと、確率1/2でどちらかのプロセスが反応して意味不明に…
import os
ret = os.path.exists("/tmp/hoge")
print ret
ファイルが存在すると、retがTrueになる。
def check(candidate):
if not candidate in [2,4,6]: raise "Exception"
return "OK"
for i in range(0,8)
ret = ""
try :
ret = check(i)
break
except :
continue
print i, ret
あと、知らなかったんだけど、sys.exit()で返り値を付けると、これがexceptionのようにraiseされてくる。
try: sys.exit(1) except Exception,e: print "Caught %s"%(e)とすると、'1'を受け取れる。
sum([i**2 for i in A]) ** 0.5で、ベクトルのノルム(長さ・二乗和のルート)が取れる。
A = [1,2,3,4,5]
for a in A:
print a
if a == 2:
A.remove(a)
リストに2が現れたら削除したので、この結果は1,2,3,4,5と期待されるが、
実際には1,2,4,5,になる。(リストがずれたから)
A = range(2,100)
skips = []
for i, a in enumerate(A):
if i in skips: continue
print a
for j, b in enumerate(A[i:]):
if b % a == 0:
skips.append(j)
A = [1,2,3] B = [4,5,6] C = [A[i]+B[i] for i in range(3)]C=[5,7,9]になります。
A = ["Hello", "Goodbye"] B = ["kei", "rei"] C = [x + ' ' + y for x in A for y in B]C=["Hello kei", "Hello rei", "Goodbye kei", "Goodbye rei"]ってなります。
s = "hello, world!"
p = "o, w"
if p in s
print "Matched"
てすると、MAtchedが表示されます。
import os
os.access("/tmp", os.W_OK)
これで、/tmpに書けるかどうか調べられる。
import random
def random_str(self, length = 20):
ret = ""
for i in range(length):
ret += random.choice(string.ascii_letters)
return ret
import sys, os
def E(m):
os.write(2, m)
for i,arg in enumerate(sys.argv):
E("%d : %s \n", i, arg)
fd_in = os.fdopen(0, "r") fd_out = os.fdopen(1, "w")こうすると、fd_inはsys.stdinと、fd_outはsys.stdoutと等価に使える。
fd_in.readline()
fd_out.write("hello")
s = "abc"\ "def"\ "ghi"は、
s = "abc" + "def" + "ghi"と同じ。
N = 10000
A = [True] * N
for i in range(2,N):
if not A[i] : continue
print i
for j in range(i*2,N,i):
A[j] = False
import os
def print_plot(typ, f):
csv = os.path.join(typ, f)
png = os.path.join(typ, f[:-3] + "png")
print """set terminal png;
set out "%(png)s";
set datafile separator ",";
plot "%(csv)s" index 0 using 0:1 with lines title "X", "%(csv)s" using 0:2 with lines title "Y", "%(csv)s" using 0:3 with lines title "Z";
#plot "%(csv)s" using 0:1,
"""%locals()
for typ in ["armup", "armdown", "normal"]:
for f in os.listdir(typ):
if f.endswith(".csv"):
print_plot(typ, f)