18 7月 2013

[Jython] Use JNA Read/Write Windows Registry

最近用Sikuli開發,Run Script時需要讀寫Windows的Registry,由於Sikuli script是用Jython的,而Jython裡並不像Python支援Read/Write Windows Registry,所以必須用一些其他的Library才行

而其中一個方法就是用JNA
下載最新的JNA與JNA-Platform
放到要執行的Script旁,或是放到Jython的目錄裡

以下的範例,將jna-3.5.1.jar與jna-platform-3.5.1.jar放到Sample.py旁,以Jython執行
Sample.py
import os
import sys
folder = os.path.dirname(os.path.abspath(__file__))

# load JavaLib jna/platform
sys.path.append(os.path.join(folder, 'jna-3.5.1.jar'))
sys.path.append(os.path.join(folder, 'jna-platform-3.5.1.jar'))

# Read
from com.sun.jna.platform.win32 import Advapi32Util, WinReg
path = Advapi32Util.registryGetStringValue( \
    WinReg.HKEY_LOCAL_MACHINE, 
    r'Software\CyberLink\ColorDirector2', 
    'InstallPath' )

print path.encode(sys.getfilesystemencoding())


Reference

17 7月 2013

[Python] Windows底下 使用SWIG呼叫C/C++的function

使用Python的script language的特性,開發起來實在是又快又舒服,但是Python有個致命的缺點就是GIL,在Multi-Thread的機制下,有了這個GIL的限制,感覺Multi-Thread就被俺掉一半了。照理來說heavy的blocking code應該要寫在另一條thread,並且放掉GIL,讓其他的thread有時間去做事才對。透過Python轉call進C/C++的function後,才有機會讓heavy的function放掉Python的GIL。

不過,本篇的重點在於介紹如果讓Python呼叫C/C++ level的function,有機會的話,再介紹一下GIL好了。目前其實有很多Tool提供這樣的功能,包括SWIG、Boost.Python、Robin…等等,這邊就介紹一下SWIG的用法。