วิธีอัพโหลด Package/Module สำหรับ pip install

Supphawit Wuttiprasit
THiNKNET Engineering
3 min readJun 7, 2018

--

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 ซึ่งเพิ่มความสะดวกในการเรียกใช้งาน สำหรับแพ็กเกจที่ผมเอามาทดลองทำให้ดูเป็นแค่พื้น ๆ (แล้วก็ทำขึ้นขำ ๆ เท่านั้นครับ) สำหรับงานจริง ๆ จัง ๆ ก็สามารถทำแบบเดียวกันและอัพขึ้นใช้งานได้เลย

--

--