Я опублікував аналогічну відповідь також на питання щодо імпорту з пакетів побратимів. Ви можете побачити тут .
Рішення без 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!