なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

pythonのctypesで自分で書いたdllを試す

gccでコンパイルしたらwindows上でもctypes.windllではなくctypes.cdllじゃないと戻り値がうまくいかなかった

gcc -c foo.c
gcc -shared -o foo.dll foo.o
python usedll.py

//foo.c
#include
int hello(int x,int y)
{
printf("helloworld\n");
return x+y;
}

#usedll.py
from ctypes import *
dll = cdll.LoadLibrary(r"c:\prog\c\test\mydll.dll")
ret = dll.hello(1,2)
print "ret is " + str(ret)


書式文字列攻撃対策

gccの場合コンパイルするときに -Wformat=2 とオプションを指定すれば警告してくれるようだ。

pythonで m4aをmp3に変換するffmpegのフロントエンドみたいなの

ffmpegていう動画とか音楽のフォーマットを変換できるCUIプログラムがあるのだけど、それをGUIで操作でm4aファイルをmp3形式に変換できるようにするpythonスクリプトを書いてみた。(こういうプログラムをラッパーとかフロントエンドとか呼ぶのか?)

動作確認環境 python2.6 windows Vista 32bit
ffmpeg.exeを別途ダウンロードしてスクリプトと同じフォルダに準備する必要あり、またwinsound.PlaySoundの命令は必ずしも必要ではないのでwavを準備するのがめんどくさいなら削除して実行すればいい。
絶対pathをつくるために文字列を組み合わせるときの処理にかなり手を焼いた。日本語がはいってくるとどうしても文字コードが混同してしまって難しくなってします。
あとは、はじめてpythonで例外処理を使ってみた。基本は
try:
command
except WindowsError:
command

みたいな感じで使えばいい。
exceptのあとに何も例外名をいれないと全ての例外が処理されるようだ。
あとJavaでそうであるようにpythonでも例外になろうとならまいとfinalyとかいう接をつくるとその節は常に実行されるらしい。


#coding:utf-8
from Tkinter import *
from tkMessageBox import *
import tkFileDialog
import glob,os,winsound

def ask() :
global dirname,isselect
dirname = tkFileDialog.askdirectory(initialdir = dirname)
if dirname == "": return
isselect = True
os.chdir(dirname)
#print "selected dir is ",os.getcwdu()

def convert():
global dirname,condition,ffmpegDir,root,canvas
if not isselect :
showinfo(title="エラー",message="フォルダを選択してください")
return
percent = 0.0
try:
os.mkdir(dirname+"\\"+CHID_DIR)
except WindowsError:
pass
m4a_list = glob.glob("*.m4a")
#print m4a_list
if len(m4a_list) == 0 : return
try:
winsound.PlaySound(seDir + u"\\" + se1,winsound.SND_FILENAME)
for i in range(len(m4a_list)):
m4a_list[i] = m4a_list[i].decode("cp932")
#print "list = ",m4a_list
canvas.create_rectangle(0,0,BARX,15,fill="white")
condition.set("変換中")
root.update()
for i in range(len(m4a_list)):
#print "converting ",m4a_list[i]
outputname = CHID_DIR + "\\" + m4a_list[i].replace(".m4a",".mp3")
outputname = u'"' + outputname + u'"'
inputname = dirname+ u"\\" + m4a_list[i]
inputname = u'"' + inputname + u'"'
#print "outputname = ",outputname
#print "inputname = ",inputname
os.spawnv(os.P_WAIT,ffmpegDir,[ffmpegDir,"-y", \
"-i",inputname,"-f","mp3",outputname])

#print outputname," is created"
percent = (float)(i+1) / (float)(len(m4a_list))
#print percent*100.0,"%"
canvas.create_rectangle(0,0,\
percent *BARX,15,fill="blue")
root.update()
winsound.PlaySound(seDir + u"\\" + se3,winsound.SND_FILENAME)
condition.set("変換可能")
showinfo(title="変換終了",message="変換作業が完了しました")
except WindowsError:
winsound.PlaySound(seDir + u"\\" + se2,winsound.SND_FILENAME)
showinfo(title="エラー",message="変換作業中にエラーが発生しました")
condition.set("変換可能")


isselect = False
CHID_DIR = "mp3"
BARX = 200
se1 = u"se_moc03.wav"
se2 = u"se_moc05.wav"
se3 = u"se_sud08.wav"
dirname = r"C:"
ffmpegDir = seDir = os.getcwd() ; ffmpegDir += r"\ffmpeg.exe"
#print ffmpegDir
#print seDir
root = Tk()
root.title("iTunesの形式をMP3に変換するソフト")
#root.withdraw()
condition = StringVar()
condition.set("変換可能")
condition_label = Label(textvariable=condition)
condition_label.pack(expand=True,fill=BOTH)
button1 = Button(text="フォルダ選択",command=ask)
button1.pack(expand=True,fill=BOTH)
button2 = Button(text="変換",command=convert)
button2.pack(expand=True,fill=BOTH)
button3 = Button(text="終了",command=exit)
button3.pack(expand=True,fill=BOTH)
canvas = Canvas(root,bg="white",width=BARX,height=15)
canvas.pack()
root.mainloop()


pythonの辞書型をつかってみた

Pythonには辞書型なるデータ型がある


>>> d = {1:2,2:4,3:6}
>>> for x in range(1,4):
... d.get(x)
...
2
4
6


>>> d.update({4:8})
>>> d
{1: 2, 2: 4, 3: 6, 4: 8}
>>> d.get(4)
8

辞書には関数もつっこむことができる。
>>> def test():
... print "hello"
...
>>> d.update({5:test})
>>> d
{1: 2, 2: 4, 3: 6, 4: 8, 5: }
>>> d.get(5)

>>> d.get(5)()
hello

これを利用すればpythonにないswitch文のようなことができる

>>> def one():
... print "one"
...
>>> def two():
... print "two"
...
>>> def three():
... print "three"
...

>>> d = {1:one,2:two,3:three}
>>> d.get(1)()
one
>>> d.get(2)()
two
>>> d.get(3)()
three
>>> x = 2
>>> d.get(x)()
two
>>>

python で プログラムを起動する

windowsでos.spawnv()関数を用いると指定したパスのプログラムを実行できる
この関数の3番目の引数のリストは指定したプログラムの引数となる。

import os
os.spawnv(os.P_NOWAIT,"C:\\Windows\\System32\\shutdown.exe",["shutdown.exe","-s","-t","40"])

上のスクリプトをwindowsで実行すると、40秒後にWindowsが終了する。

↓のスクリプトだとメモ帳を起動できる。ちなみにこの関数の戻り値は作成したプロセスのIDとなる
import os
os.spawnv(os.P_NOWAIT,"C:\\Windows\\System32\\notepad.exe",["notepad.exe"])

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。