ฉันโพสต์คำตอบที่คล้ายกันกับคำถามเกี่ยวกับการนำเข้าจากแพ็คเกจพี่น้อง คุณสามารถดูได้ที่นี่
ทางออกที่ไม่มีsys.path
แฮ็ค
สรุป
- ล้อมโค้ดไว้ในหนึ่งโฟลเดอร์ (เช่น
packaged_stuff
)
- ใช้สร้าง
setup.py
สคริปต์ที่คุณใช้setuptools.setup ()
- Pip ติดตั้งแพคเกจในสถานะที่แก้ไขได้ด้วย
pip install -e <myproject_folder>
- นำเข้าโดยใช้
from packaged_stuff.modulename import function_name
ติดตั้ง
ฉันถือว่าโครงสร้างโฟลเดอร์เดียวกับในคำถาม
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
ที่ผมเรียกว่าโฟลเดอร์รากและในกรณีของฉันมันตั้งอยู่ใน.
C:\tmp\test_imports
ขั้นตอน
1) เพิ่ม a setup.py
ไปยังโฟลเดอร์รูท
เนื้อหาของsetup.py
สามารถเป็นเพียง
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
โดยทั่วไป "ใด ๆ " setup.py
จะทำงาน นี่เป็นเพียงตัวอย่างการทำงานที่น้อยที่สุด
2) ใช้สภาพแวดล้อมเสมือน
หากคุณคุ้นเคยกับสภาพแวดล้อมเสมือนให้เปิดใช้งานหนึ่งและข้ามไปยังขั้นตอนถัดไป การใช้งานของสภาพแวดล้อมเสมือนจริงนั้นไม่จำเป็นอย่างแท้จริงแต่จะช่วยคุณได้จริงในระยะยาว (เมื่อคุณมีมากกว่า 1 โครงการที่กำลังดำเนินการ .. ) ขั้นตอนพื้นฐานที่สุดคือ (เรียกใช้ในโฟลเดอร์รูท)
- สร้าง env เสมือน
- เปิดใช้งาน env เสมือน
. /venv/bin/activate
(Linux) หรือ./venv/Scripts/activate
(Win)
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสิ่งนี้เพียงแค่ Google "python virtualenv tutorial" หรือที่คล้ายกัน คุณอาจไม่ต้องการคำสั่งอื่นใดนอกจากสร้างเปิดใช้งานและปิดใช้งาน
เมื่อคุณสร้างและเปิดใช้งานสภาพแวดล้อมเสมือนจริงแล้วคอนโซลของคุณควรให้ชื่อของสภาพแวดล้อมเสมือนในวงเล็บ
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) pip ติดตั้งโครงการของคุณในสถานะที่แก้ไขได้
ติดตั้งแพคเกจระดับบนสุดของคุณโดยใช้myproject
pip
เคล็ดลับคือการใช้การ-e
ตั้งค่าสถานะเมื่อทำการติดตั้ง วิธีนี้จะถูกติดตั้งในสถานะที่แก้ไขได้และการแก้ไขทั้งหมดที่ทำกับไฟล์. py จะรวมอยู่ในแพ็คเกจที่ติดตั้งโดยอัตโนมัติ
ในไดเรกทอรีรากให้เรียกใช้
pip install -e .
(สังเกตจุดนั้นย่อมาจาก "ไดเรกทอรีปัจจุบัน")
คุณสามารถเห็นว่ามันถูกติดตั้งโดยใช้ pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4) นำเข้าโดยต่อท้ายmainfolder
ทุกการนำเข้า
ในตัวอย่างนี้จะเป็นmainfolder
ptdraft
นี่เป็นข้อดีที่คุณจะไม่พบในการชนชื่อกับชื่อโมดูลอื่น (จากไลบรารีมาตรฐานของไพ ธ อนหรือโมดูลบุคคลที่สาม)
ตัวอย่างการใช้งาน
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
ใช้ life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!