วิธีอัพโหลด Package/Module สำหรับ pip install
PyPI คืออะไร
PyPI ย่อมาจาก Python Package Index เป็นคลังโปรแกรมและไลบรารีเสริมของ Python โดย Python เวอร์ชั่นใหม่ ๆ สามารถสั่งติดตั้งโมดูลจาก PyPI ได้ด้วยคำสั่ง pip หรือคำสั่ง easy_install ได้ครับ
อ้างอิงจาก: https://python3.wannaphong.com/2015/04/python-pypi.html
สามารถเข้าไปดาวน์โหลดเพื่อดูไฟล์ต่าง ๆ ที่ Github ได้นะครับ
ในการที่จะอัพแพ็กเกจนั้นจำเป็นต้องสมัครสมาชิกที่เว็บ PyPI ซะก่อน
และผมแนะนำให้สมัครของ TestPyPI ด้วยครับ
การตั้งชื่อให้กับแพ็กเกจ
- ต้องเป็นตัวเล็กทั้งหมด
- ไม่ซ้ำชื่อกับแพ็กเกจอันอื่น
- ไม่มี Underscore หรือเว้นวรรค
โครงสร้าง Folder
root/
setup.py
REAME.md
MANIFEST.in
bin/
grandmasomsri-status
grandpaprayud-status
graph-power
src/
grandmasomsri/
grandmaSomsri.py
grandpaPrayud.py
graph/
power.py
ในการสอนครั้งนี้ผมจะอัพแพ็กเกจของผมชื่อ grandmasomsri นะครับ
ตัวแพ็กเกจของเราคือ src/grandmasomsriโดยผมจะทำเป็นแพ็กเกจที่แสดงสถานะของยายสมศรี (นามสมมุติ) และตาประหยัด (นามสมมุติ) และมีกราฟพลัง เพื่อให้เข้าใจและเห็นภาพลองไปดูกันเลยดีกว่าว่าจะทำยังไง
หลังจากนี้ผมจะอธิบายเป็นไฟล์ ๆ ไปนะครับว่าหน้าที่ของมันคืออะไร
setup.py ภายในไฟล์มีดังนี้:
ขอพูดถึงแค่ตัวที่ต้องทำความเข้าใจนะครับ ตัวไหนที่ง่าย ๆ ผมจะข้ามไป
- name ให้ใส่ชื่อของแพ็กเกจ
- version ให้ใส่เป็นเวอร์ชั่นของแพ็กเกจของเราในที่นี้ผมเริ่มที่ 0.1 (จะเริ่มจาก 1 หรือ 0.0.1 ได้หมดครับ แต่ในการอัพขึ้นไปใหม่ต้องเปลี่ยนตัวเลขให้เพิ่มขึ้นไม่ให้ซ้ำกับของเก่า ไม่งั้นจะอัพไม่ได้)
- long_description เรียกใช้ฟังก์ชั่น readme() อธิบายง่าย ๆ คือใส่ README.md ให้กับตัวแพ็กเกจนั่นแหละครับ
- install_requires เอาไว้ในกรณีที่ไฟล์ของเรามีการ import ตัวแพ็กเกจมาจากแพ็กเกจอื่นและต้อง pip install ในการติดตั้ง เพิ่มชื่อแพ็กเกจนั้นลงไป เวลาเราติดตั้งแพ็กเกจของเราจะดาวน์โหลดให้อัตโนมัติ
- scripts หากต้องการให้หลังติดตั้งสามารถเรียกใช้แพ็กเกจได้เลย ผ่าน Command Line สร้างไฟล์ไม่มีนามสกุลไว้ใน bin/ ในตัวอย่างคือคำสั่ง grandmasomsri-status, grandpaprayud-status, graph-power
- packages อันนี้ตั้งให้ตรงกับ name ครับ
- package_dir ใส่ชื่อ Package และ path ไปยังโฟลเดอร์ Package
- package_data ใช้สำหรับเพิ่มไฟล์เข้าไปในแพ็กเกจเพราะบางไฟล์ ตอนบีบไฟล์ก่อนอัพขึ้นมันจะไม่ถูกรวมไปกับไฟล์บีบอัดด้วยก็มีครับ
ไฟล์ setup.py นั้นมี Key Argument เยอะกว่านะนี้ครับเข้าไปดูได้ ที่นี่
grandmaSomsri.py ภายในไฟล์มีดังนี้:
grandpaPrayud.py ภายในไฟล์มีดังนี้:
power.py ภายในไฟล์มีดังนี้:
จะเห็นว่ามีการ import ตัว matplotlib และ numpy มาใช้ซึ่งการใช้งานจะไม่เกิดปัญหาไม่พบแพ็กเกจเนื่องจากเราใส่ install_requires สำหรับ 2 แพ็กเกจนี้แล้ว
Command Line Script
grandmasomsri-statusใน bin ภายในมีดังนี้:
grandpaprayud-statusใน bin ภายในมีดังนี้:
graph-power ใน bin ภายในมีดังนี้:
พวกไฟล์ script ถ้าให้พูดเข้าใจง่าย ๆ คือการที่เขียนมาเพื่อดึงเอาแพ็กเกจของเราออกมาใช้นั่นเอง
MANIFEST.in ภายในไฟล์มีดังนี้:
include README.md
จะเป็น README ที่เว็บไซต์ PYPI
ในตอนนี้สามารถทดลองติดตั้งลงเครื่องได้แล้วครับโดยใช้คำสั่ง:
$ pip install .
การติดตั้งแบบนี้คือติดตั้งเฉพาะในเครื่อง (local) นะครับ เอาไว้ทดสอบว่าแพ็กเกจ เราใช้งานได้ปกติหรือเปล่า
อัพโหลดขึ้น PyPI กับ TestPyPI กันเลย
ในขั้นตอนแรกต้องสร้าง tar.gz ของตัวแพ็กเกจจากคำสั่ง:
$ python setup.py sdist
หรือ
$ python3 setup.py sdist bdist_wheel
จะได้ไฟล์ dist/grandmasomsri-0.1.tar.gz ภายในโฟลเดอร์ root และจะได้ไฟล์อื่น ๆติดมาด้วยก็ไม่ต้องไปสนใจปล่อยไว้อย่างนั้นครับ
ในการอัพขึ้นเราจะใช้ twine ในการอัพ อย่างแรกคือต้องติดตั้ง twine ด้วยใช้คำสั่ง:
$ pip install twine --upgrade
หรือ
$ python3 -m pip install --user --upgrade twine
หลังจากติดตั้ง twine เสร็จแล้ว ก็สามารถอัพขึ้น PyPI ได้แล้ว แต่ก่อนจะทำอย่างนั้นผมแนะนำให้ทดลองอัพขึ้นตัว TestPyPI ก่อนเพื่อความชัวร์
TestPyPI
อัพขึ้น TestPyPI ได้ด้วยคำสั่ง:
$ twine upload --repository-url https://test.pypi.org/legacy/ dist/*
ในคำสั่งนี้จะถาม Username และ Password ให้กรอกที่เราสมัคร TestPyPI ไปข้างต้น หลังอัพเสร็จแล้วสามารถเข้าไปเช็คได้ที่ TestPyPI (Login in ก่อนนะครับ)
PyPI
อัพขึ้น PyPI ได้ด้วยคำสั่ง:
$ twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
ในคำสั่งนี้จะถาม Username และ Password ให้กรอกที่เราสมัคร PyPI ไปข้างต้น หลังอัพเสร็จแล้วสามารถเข้าไปเช็คได้ที่ PyPI (Log in ก่อนนะครับ)
การติดตั้งแพ็กเกจโดยใช้คำสั่ง pip
หลังจากทำตามลำดับมาเรื่อย ๆ ตอนนี้สามารถติดตั้งได้ด้วยคำสั่ง:
$ pip install grandmasomsri
จะสามารถเรียกใช้งาน script บน Command Line ด้วยคำสั่ง:
$ grandmasomsri-status
$ grandpaprayud-status
$ graph-power
สรุป
จบแล้วนะครับสำหรับการอัพแพ็กเกจหรือโมดูลฝากไว้ที่ PyPI ซึ่งเพิ่มความสะดวกในการเรียกใช้งาน สำหรับแพ็กเกจที่ผมเอามาทดลองทำให้ดูเป็นแค่พื้น ๆ (แล้วก็ทำขึ้นขำ ๆ เท่านั้นครับ) สำหรับงานจริง ๆ จัง ๆ ก็สามารถทำแบบเดียวกันและอัพขึ้นใช้งานได้เลย