6 มกราคม 2560

Published มกราคม 06, 2560 by with 0 comment

แหกกฎ Python : รันโมดูล Python 2 ใน Python 3

ทุกวันนี้แม้ Python เดินทางมาถึง Python 3.6 แล้ว โมดูลจำนวนมากในสมัย Python 2.X ได้ถูก port มา Python 3.X เกือบหมด แต่มีบางโมดูลที่นักพัฒนาไม่ได้ port หรือไม่ได้พัฒนาต่อให้รองรับ Python 3.X ทำให้หลายคนที่ใช้ Python 2.X มาก่อน มาใช้งาน Python 3.X พบปัญหานี้ จึงต้องหาโมดูลทดแทนหรือกลับไปใช้งาน Python 2.X ต่อไป


บทความนี้ขอนำเสนอวิธีช่วยให้สามารถใช้งานโมดูลที่พัฒนาให้เฉพาะ Python 2.X สามารถใช้งานได้ แม้ว่า อาจใช้ไม่ได้ทุกโมดูล Python 2.X ทั้งหมด แต่ช่วยให้สามารถใช้งานโมดูลที่ยังสามารถทำงานได้
ข้อแนะนำ
ควรเลือกโมดูลที่เป็น Pure Python (เขียนด้วยภาษา Python 100%) และสามารถติดตั้งด้วย pip ได้

ให้ทำการอัพเดต future ด้วยคำสั่ง
$ pip install future -U

ใน future ประกอบไปด้วยเครื่องมือหลายตัวสำหรับพัฒนาโค้ดใช้งานได้ทั้ง Python 2 และ Python 3
ในที่นี้ขอเลือก past ในคำสั่ง autotranslate ซึ่งเป็นเครื่องมือสำหรับแปลงโค้ดโมดูล Python 2 มาใช้งานใน Python 3 แบบอัตโนมัติ

การใช้งาน past ในคำสั่ง autotranslate

from past import autotranslate
autotranslate(['ชื่อโมดูลที่ต้องการ'])

บทความนี้ขอเลือกโมดูล codegrapher เป็นโมดูลสำหรับสร้าง graphs code จากโค้ดไฟล์ Python ช่วยให้สามารถเห็นองค์ประกอบการทำงานของไฟล์งาน Python ได้ รองรับเฉพาะ Python 2 เท่านั้น และ ใช้ MIT License

หน้าโมดูล https://pypi.python.org/pypi/codegrapher/

ก่อนใช้งานให้ทำการติดดั้ง  graphviz แล้วตั้งค่า path ให้เรียบร้อย

ในการติดตั้งด้วย pip ต้องเติม --no-compile ลงไปด้วย
ติดตั้งด้วยคำสั่ง :
pip install codegrapher --no-compile


การนำ autotranslate มาใช้งานจริง

ก่อนอื่น ให้ทำการสร้างไฟล์โค้ดที่ต้องการให้ codegrapher สร้าง grapher จากโค้ดในไฟล์ที่กำหนด
hi.py

class a:
 def hello():
  return 'hello'

a1 = a
print(a1.hello())

ต่อไปถึงเวลาเรียกใช้งานโมดูล codegrapher ใน Python 3
จากโค้ดใน Python 2

from codegrapher.parser import FileObject
file_object = FileObject('hi.py') # ชื่อไฟล์ โดยต้องอยู่ในโฟลเดอร์เดียวกัน
file_object.visit()

from codegrapher.graph import FunctionGrapher

graph = FunctionGrapher()
graph.add_file_to_graph(file_object)
graph.name = 'name'
graph.format = 'png'
graph.render() # ทำการส่งออก

เป็นโค้ดรันใน Python 3

from past import autotranslate
autotranslate(['codegrapher.graph','codegrapher.parser']) # เลือกโมดูลที่ต้องการใช้งาน
from codegrapher.parser import FileObject
file_object = FileObject('hi.py') # ชื่อไฟล์ โดยต้องอยู่ในโฟลเดอร์เดียวกัน
file_object.visit()

from codegrapher.graph import FunctionGrapher

graph = FunctionGrapher()
graph.add_file_to_graph(file_object)
graph.name = 'name'
graph.format = 'png'
graph.render() # ทำการส่งออก

ผลลัพธ์

จะได้ไฟล์ name.png แสดงว่าโมดูลนี้ทำงานอยู่บน Python 3 แล้ว :)


อ่านเอกสารได้ที่ http://python-future.org/
เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ ที่ https://python3.wannaphong.com/

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

แสดงความคิดเห็น

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