Я отправил аналогичный ответ также на вопрос об импорте из родственных пакетов. Вы можете увидеть это здесь .
Решение без 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) 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
. Преимущество этого заключается в том, что вы не столкнетесь с конфликтами имен с другими именами модулей (из стандартной библиотеки 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!