Я опублікував аналогічну відповідь також на питання щодо імпорту з пакетів побратимів. Ви можете побачити тут .
Рішення без 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) Додайте setup.pyдо кореневої папки
Вміст цього setup.pyможе бути простим
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
В основному "будь-який" setup.pyпрацював би. Це лише мінімальний робочий приклад.
2) Використовуйте віртуальне середовище
Якщо ви знайомі з віртуальними середовищами, активуйте одне і перейдіть до наступного кроку. Використання віртуальних середовищ не є абсолютно необхідним, але вони дійсно допоможуть вам у довгостроковій перспективі (коли у вас більше 1 проекту, який триває ..). Найбільш основні кроки - це запуск у кореневій папці
- Створити віртуальне оточення
- Активувати віртуальне оточення
. /venv/bin/activate(Linux) або ./venv/Scripts/activate(Win)
Щоб дізнатися більше про це, просто Google випустив "навчальний посібник python virtualenv" або подібне. Можливо, вам ніколи не потрібні інші команди, крім створення, активації та деактивації.
Після того як ви створили та активували віртуальне середовище, ваша консоль повинна вказати назву віртуальної середовища в дужках
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) встановіть проект у редагованому стані
Встановіть пакет верхнього рівня 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. Це має ту перевагу, що ви не зіткнетесь зі зіткненнями імен з іншими іменами модулів (зі стандартної бібліотеки python або сторонніх модулів).
Приклад використання
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!