หลายครั้งที่เราสร้างโค้ด python เราพบว่าเราจำเป็นต้องเข้าถึงโค้ดจากไฟล์หรือแพ็คเกจอื่นของ python นี่คือเวลาที่คุณต้องนำเข้าไฟล์หรือแพ็คเกจอื่น ๆ ของ python ไปยังรหัสปัจจุบันของคุณ ดังนั้นวิธีที่ตรงไปตรงมาในการบรรลุสิ่งนี้คือเขียนคำสั่งด้านล่างที่ด้านบนสุดของโปรแกรม python ปัจจุบันของคุณ
import package_name or module_name or from pacakge_name import module_name/object_name
เมื่อแยกวิเคราะห์คำสั่งข้างต้น ล่ามจะทำสิ่งต่อไปนี้
-
ล่ามจะค้นหาชื่อในแคชของโมดูลทั้งหมดที่นำเข้ามาก่อนหน้านี้ ชื่อของโมดูลแคชนี้ใน sys.modules
-
หากไม่พบในขั้นตอนข้างต้น ล่ามจะค้นหาในรายการโมดูลในตัว โมดูลเหล่านี้เป็นส่วนหนึ่งของไลบรารีมาตรฐานของหลาม
-
ในกรณีที่ยังไม่พบในขั้นตอนที่ 2 ด้านบน ล่ามจะค้นหาชื่อแพ็คเกจหรือโมดูลในรายการไดเร็กทอรีที่กำหนดไว้ใน sys.path ซึ่งมีไดเร็กทอรีปัจจุบันเป็นไดเร็กทอรีแรกที่จะค้นหา
-
เมื่อพบว่าเป็นโมดูลที่นำเข้าในขั้นตอนข้างต้น ชื่อของแพ็คเกจหรือโมดูลจะถูกผูกไว้กับขอบเขตในเครื่องของโปรแกรมปัจจุบัน
-
หากไม่พบแพ็คเกจหรือโมดูล แสดงว่า ModuleNotFoundError ปรากฏขึ้น
กฎบางประการเกี่ยวกับการนำเข้า
คำสั่งนำเข้าควรระบุไว้ที่ด้านบนของไฟล์โดยใช้คำสั่งเหล่านั้น ลำดับที่จะต้องกล่าวถึงการนำเข้ามีดังนี้
-
โมดูลไลบรารีมาตรฐานของ Python
-
นำเข้าจากโมดูลของบุคคลที่สาม
-
นำเข้าจากแอปพลิเคชันในพื้นที่
นำเข้าแบบสัมบูรณ์
ในการนำเข้าประเภทนี้ เราระบุพาธแบบเต็มของ package/module/function ที่จะนำเข้า จุด (.) ถูกใช้ตามเครื่องหมายทับ (/) สำหรับโครงสร้างไดเร็กทอรี
พิจารณาโครงสร้างไดเร็กทอรีต่อไปนี้สำหรับแพ็คเกจ
python_project_name/packageA/moduleA1.py python_project_name/packageA/moduleA2.py
นอกจากนี้ สมมติว่า moduleA2 มีชื่อฟังก์ชัน myfunc เมื่อเราต้องการนำเข้าฟังก์ชันนั้นไปยังโปรแกรม python ปัจจุบันของเรา จากนั้นใช้เส้นทางที่แน่นอน เราจะพูดถึงคำสั่งนำเข้าต่อไปนี้
from packageA.moduleA2 import myfunc
ข้อได้เปรียบที่สำคัญของการนำเข้าแบบสัมบูรณ์คือ มันแสดงให้เห็นอย่างชัดเจนว่าการนำเข้าเกิดขึ้นที่ใด ในขณะที่บางครั้งอาจใช้เวลานานมาก
นำเข้าสัมพัทธ์
ในการนำเข้าแบบสัมพันธ์ เรากล่าวถึงเส้นทางของแพ็คเกจที่นำเข้าว่าสัมพันธ์กับตำแหน่งของสคริปต์ปัจจุบันซึ่งกำลังใช้โมดูลที่นำเข้าอยู่
จุดบ่งชี้ไดเรกทอรีหนึ่งขึ้นจากตำแหน่งปัจจุบัน และจุดสองจุดบ่งชี้สองไดเรกทอรีขึ้นเป็นต้น
พิจารณาโครงสร้างไดเร็กทอรีต่อไปนี้สำหรับแพ็คเกจ
python_project_name/packageA/moduleA1.py python_project_name/packageB/moduleB1.py
สมมติว่า moduleB1 ในโครงสร้างแพ็คเกจด้านบนจำเป็นต้องนำเข้า moduleA1 จากนั้นคำสั่งนำเข้าคือ:
from ..packageA import moduleA1
จุดสองจุดระบุว่าจากตำแหน่งของ moduleB1 เราต้องย้ายไปที่ไดเร็กทอรี python_project_name จากนั้นไปที่ packageA เพื่อรับ moduleA1
การนำเข้าประเภทนี้สั้นและโครงการระดับบนสุดสามารถย้ายจากที่หนึ่งไปยังอีกที่หนึ่งโดยไม่ต้องเปลี่ยนเส้นทางในคำสั่งการนำเข้าอย่างง่ายดาย ข้อเสีย ถ้าโฟลเดอร์นำเข้าถูกแชร์ โค้ดจะได้รับผลกระทบอย่างง่ายดายเมื่อมีการแก้ไขบางอย่างในพาธ