PythonNet是一個和IronPython想法差不多,但絕不一樣。PythonNet可以讓你寫指令碼來調用.Net Framework ,或者是你自己寫的dll。是在sourceforge上的一個開源項目。用法的話就是先下載一個Python的 解譯器,安裝完後,用下載下來的Python.Net裡相應版本的檔案替換掉原先的。 http://pythonnet.sourceforge.net/ ,支援到dotnet 2.0.
比如,下載了Python 2.5安裝到C盤,路徑是 C:\Python25 ,把D:\pythonnet-2.0-alpha2\python2.5-UCS2目錄中的所有檔案複製到C:\Python25 ,現在就可以使用了。
試試代碼
import System
class Test():
_id = 0
_name = "123"
def __init__(self,id,name):
self._id = id
self._name = name
def main():
app = Test(123,"asd")
System.Console.WriteLine(app._id)
System.Console.WriteLine(app._name)
System.Console.ReadKey()
if __name__ == '__main__':
main()
這就是一個控制台程式了,當然,也可以做Winform的。但是,我覺得直接用Python作的話好像沒什麼好處,但是用作調用還是很不錯的。
但是C#裡有ref傳值和out傳值,怎麼辦呢?在Python裡都是傳引用的,但是在這裡似乎不行啊。
import System as s
def main():
m = "123"
r = 0
x = s.Int32.TryParse(m,r)
s.Console.WriteLine(r)
s.Console.ReadKey()
if __name__ == '__main__':
main()
上面的代碼輸出值是0,這就明顯不對。但是輸出x是個亂碼,看它的類型,是個數組。
import System as s
def main():
m = "123"
r = 0
x = s.Int32.TryParse(m,r)
s.Console.WriteLine(x[0])
s.Console.WriteLine(x[1])
s.Console.ReadKey()
if __name__ == '__main__':
main()
改造了下代碼果然可以了。輸出了1123第一個1,應該是True的數值表示,而123就是轉換後的值了。而對於ref傳值,也是一樣的。
import SharpBot.Engin as Engin
import HopeUtil.HTML as html
import System as s
def main():
app = Engin.DefaultCrawler("http://www.163.com");
result = html.HTMLSimpleDOM.HTMLSimpleModel()
suc = app.ResponseString(result)
if suc[0]:
s.Console.WriteLine(suc[1].Title)
s.Console.WriteLine(suc[1].MetaCharset)
s.Console.WriteLine(suc[1].Body)
else:
s.Console.WriteLine(123)
if __name__ == '__main__':
main()
上面的ResponseString在C#裡參數是(ref HTMLSimpleDOM.HTMLSimpleModel result)。這裡也返回到了數組中了。用指令碼來測試寫的爬蟲引擎,感覺還不錯。用指令碼操作dotnet感覺就是不一樣。