Я опубликовал аналогичный ответ и на вопрос об импорте из родственных пакетов. Вы можете видеть это здесь . Следующие тестируются с Python 3.6.5, (Anaconda, conda 4.5.1), машина Windows 10.
Решение без взлома sys.path
Настройка
Я предполагаю ту же структуру папок, что и в вопросе
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Я называю .
корневой папкой, и в моем случае она находится в C:\tmp\test_imports
.
Steps
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 Virtual Env 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
. Преимущество этого заключается в том, что вы не столкнетесь с конфликтами имен с другими именами модулей (из стандартной библиотеки 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!