29 พฤศจิกายน 2560

Published พฤศจิกายน 29, 2560 by with 1 comment

ใช้ Python ใน .NET Framework ด้วย pythonnet


สวัสดีผู้อ่านทุกท่านครับ หากผู้อ่านเป็นนักพัฒนาที่ใช้ .NET Framework ในการพัฒนาโปรแกรมไม่ว่าจะเป็นภาษา C#, F# และ visual basic เป็นต้น แต่คุณกลับเจอปัญหา คือ ไม่สามารถหาโมดูลใน .NET Framework มาทดแทนได้ ตัวอย่างเช่น PyThaiNLP หรือ คุณต้องการเขียนโค้ดใช้งานทั้ง Python และ .NET Framework คุณสามารถทำได้โดยใช้ pythonnet
pythonnet เป็นเครื่องมือสำหรับใช้เชื่อม Python กับ .NET Framework
ก่อนอื่นให้ทำการติดตั้ง Python.NET ลงใน Python ก่อน ด้วยคำสั่ง
pip install pythonnet

การใช้งาน Python ใน .NET Framewok

คำเตือน !!! คุณต้องตั้งค่า compiler ให้ตรงกับรุ่น Python ที่ใช้ หรือ ใช้ Python ให้ตรงกับเวชั่นที่ต้องการ เช่น หากใช้ Python 64bit คุณต้องตั้งค่า compiler ของ visual studio ให้เป็น 64 bit ด้วย

ก่อนอื่น ให้ตั้งค่า Path ให้กับ Python ให้เรียบร้อย โดยจะต้องมีข้อมูลใน Path ต่อไปนี้
  • PATH - มีที่ตั้งโฟลเดอร์ Python อยู่ด้วย
  • PYTHONHOME  - ที่ตั้งโฟลเดอร์ Python
  • PYTHONPATH - ที่ตั้งโฟลเดอร์ Lib ของ Python
 
ใน visual studio ให้คลิกขวาที่ References ของโปรเจคที่ทำ > Add References...

 
กด Browse...
 
เข้าไปที่ ที่ตั้ง Python/Lib/site-packages เลือกไฟล์ Python.Runtime.dll แล้วกด Add ติ๊กถูกแล้วกด OK

   
จะได้ Python.Runtime เพิ่มเข้ามา

เสร็จแล้วมาลองโค้ดกัน
ลองเขียน C# เรียกใช้งานระบบตัดคำของ PyThaiNLP (สามารถติดตั้งได้ด้วยคำสั่ง pip install pythainlp )
static void Main(string[] args)
        {
            using (Py.GIL())
            {
                dynamic pythainlp = Py.Import("pythainlp");
                dynamic a1 = pythainlp.tokenize.word_tokenize("สวัสดีครับ","newmm");
                Console.WriteLine(a1);
                Console.ReadKey();
            }
        }
ผลลัพธ์
['สวัสดี', 'ครับ']
จะเห็นได้ว่า
  • ฟังก์ชัน Python ต้องเรียกใช้งานภายใน using (Py.GIL()) {/* Your code here */} เท่านั้น
  • คำสั่ง Py.Import("โมดูล"); เป็นคำสั่งสำหรับเรียกใช้งานโมดูล โดยเก็บ dynamic แล้วเรียกใช้งานได้คล้าย Python ได้เลย
  • และวัตถุของ Python ทั้งหมดถูกเก็บเป็น dynamic
อ่านเอกสารได้ที่่  https://github.com/pythonnet/pythonnet/blob/master/README.md#embedding-python-in-net

การใช้งาน .NET Framewok ใน Python

สามารถใช้งานได้ง่าย ๆ ตามตัวอย่างนี้
import clr
clr.AddReference("System") # เรียกใช้งาน  assembly System
from System import Math # เรียกใช้งาน Math ใน System คล้าย System.Math
print(Math.PI) # แสดง  System.Math.PI
ผลลัพธ์
3.141592653589793
อ่านเอกสารได้ที่่  https://github.com/pythonnet/pythonnet/

เขียนโดย นาย วรรณพงษ์  ภัททิยไพบูลย์
นักศึกษาชั้นปีที่ 1
สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์
มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

1 ความคิดเห็น:

  1. Could not load file or assembly 'Python.Runtime, Version=2.3.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
    คอมไพลล์ไม่ผาน แจ้งมาดังข้อความข้างต้น คืออะไรครับ

    ตอบลบ

แสดงความคิดเห็นได้ครับ :)