ฉันมีโครงสร้างไฟล์ดังนี้:
Folder
Common
foo1.py
TestFolder
foo2.py
ฉันต้องการที่จะนำเข้าในและfoo2.py
foo1.py
ฉันพยายาม แต่มันไม่ทำงานบน Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
ฉันมีโครงสร้างไฟล์ดังนี้:
Folder
Common
foo1.py
TestFolder
foo2.py
ฉันต้องการที่จะนำเข้าในและfoo2.py
foo1.py
ฉันพยายาม แต่มันไม่ทำงานบน Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
คำตอบ:
python ค้นหาโมดูลของมันอย่างไร
ดำเนินการอย่างเคร่งครัดเป็นโมดูลเป็นไฟล์หลามเดียวในขณะที่แพคเกจเป็นโฟลเดอร์ที่มีไฟล์หลามพร้อมด้วย (สามารถว่างเปล่า) แฟ้มที่ชื่อ__init__.py
เพื่อที่จะบอกหลามมันเป็นแพคเกจที่จะนำเข้าจากโมดูล ในทั้งสองกรณีโมดูลต้องการ.py
ส่วนขยาย แต่การนำเข้าทำได้โดยไม่มี (ดูเพิ่มเติมด้านล่าง)
โดยค่าเริ่มต้น Python จะค้นหาโมดูลและแพ็คเกจของ$PYTHONPATH
มัน
ในการค้นหาว่ามีอะไรรวมอยู่ใน $ PYTHONPATH ให้เรียกใช้โค้ดต่อไปนี้ในไพ ธ อน (3):
import sys
print(sys.path)
วิธีเพิ่มไดเรกทอรี
เป็นครั้งคราว
จากภายในไฟล์ไพ ธ อนคุณสามารถเพิ่มพา ธ ไปยังพา ธ เริ่มต้นเป็นครั้งคราวโดยเพิ่มบรรทัดต่อไปนี้ในส่วนหัวของแอปพลิเคชันหรือสคริปต์ของไพ ธ อน:
import sys
sys.path.insert(0, "/path/to/your/package_or_module")
ตัวอย่างเช่น:
หากฉันมีโฟลเดอร์: /home/myname/pythonfiles
และฉันต้องการนำเข้าไฟล์ที่module_1.py
อยู่ในไดเรกทอรีนั้นฉันจะเพิ่มส่วนนี้ลงในส่วนหัวของรหัสของฉัน:
import sys
sys.path.insert(0, "/home/myname/pythonfiles")
และฉันสามารถนำเข้าไฟล์module_1.py
โดย:
import module_1
เมื่อฉันสร้างแพ็คเกจและต้องการนำเข้าโมดูลจากแพ็คเกจฉันต้องสร้างโฟลเดอร์$PYTHONPATH
ที่มีโมดูลพร้อมด้วยไฟล์ (สามารถว่างเปล่า) ที่เรียกว่า__init__.py
ตัวอย่างเช่น:
นำเข้าจากแพคเกจ (โฟลเดอร์) เรียกว่าmy_package
ใน/home/myname/pythonfiles
เพิ่ม/home/myname/pythonfiles
เส้นทางไปยังคุณ$PYTHONPATH
เช่นในตัวอย่างที่ 1 และนำเข้าโมดูลที่เรียกว่าmodule_2.py
(ในโฟลเดอร์แพคเกจ) เพียงกับ: `
from <packagename> import module_2
การเพิ่มไดเรกทอรีไปยัง$PYTHONPATH
อย่างถาวร:
เพิ่มบรรทัดต่อไปนี้ใน~/.profile
ไฟล์ของคุณ
export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add
ไดเรกทอรีย่อย
จากภายในแพ็คเกจจะไม่รวมไดเรกทอรีย่อยเช่นนั้น คุณต้อง "เชน" ไดเรกทอรี ในการนำเข้าโมดูลmodule_3.py
ภายในโฟลเดอร์subfolder
ภายในโฟลเดอร์packagename
:
import packagename.subfolder.module_3
เนื่องจากข้อเท็จจริงที่ว่าโฟลเดอร์ย่อยทั้งหมดในแพ็คเกจรวม__init__.py
ไฟล์ของตนเอง
เมื่อโมดูลอยู่ในไดเรกทอรีเดียวกับสคริปต์หรือแอปพลิเคชัน
ไม่จำเป็นต้องแทรกพา ธ ไปยังโมดูลเมื่อมันอยู่ในไดเรกทอรีเดียวกับสคริปต์หรือแอปพลิเคชันมันถูกเพิ่มโดยอัตโนมัติ
ตัวอย่าง:
หากฉันมีโฟลเดอร์ที่มีscript.py
และmodule.py
ฉันสามารถนำเข้าโมดูลโดย:
import module
printenv PYTHONPATH
ไม่มีอะไร
sys.path.append("/path/to/your/package_or_module")
ยังเพิ่มเส้นทางไปยังค่าเริ่มต้นและทำให้สับสนน้อยลง เมื่อเทียบกับsys.path.insert(0,...)
สิ่งที่มี0
เป็นอาร์กิวเมนต์แรก
วิธีที่ถูกต้องในการใช้การนำเข้าแบบสัมพัทธ์คือ:
from ..Common import foo1
และคุณยังจำเป็นต้องมี__init__.py
ในทุกโฟลเดอร์ของคุณ
หมายเหตุ: คำตอบนี้ล้าสมัยสำหรับ python 3 รุ่นล่าสุด แต่อยู่ที่นี่สำหรับรุ่นก่อนหน้า สำหรับข้อมูลเพิ่มเติมอ่านความคิดเห็นและhttps://www.python.org/dev/peps/pep-0420/
เป็นหลักทุกโฟลเดอร์ที่มีรหัสหลามที่คุณต้องการเพิ่มลงใน syspath ต้องการไฟล์ __init__.py ไฟล์ __init__.py เหล่านี้สามารถว่างเปล่าได้
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
นี่คือเอกสารที่เกี่ยวข้องบางอย่างPEP 420 ซึ่งอธิบายการเพิ่มความหมายของแพ็คเกจเนมสเปซ
__init__.py
ไฟล์ในโฟลเดอร์ของคุณหรือไม่? นี่คือวิธีที่ python สร้างแพ็คเกจและอนุญาตให้คุณนำเข้าโมดูลจากแพ็คเกจนั้น guide.python-distribute.org/creation.html