Структура папок Python для каталога проектов и простого импорта - PullRequest
0 голосов
/ 12 июня 2018

У моей команды есть папка с несколькими небольшими проектами в python3.Среди них есть папка с несколькими утилитами, которые используются в проектах.Но способ импортировать его очень неудобен.Вот структура, которую мы используем:

temp_projects
    util
        storage.py
        geometry.py
    project1
        project1.py
    project2
        project2.py

Проблема в том, что импорт в проектах выглядит ужасно:

sys.path.insert(1, os.path.join(sys.path[0], '..'))
import util.geometry

util.geometry.rotate_coordinates(....)

Кроме того, Pycharm и другие инструменты испытывают проблемы с пониманием изавершение поставок.

Есть ли какой-нибудь более аккуратный способ сделать это?

Редактировать: Все проекты и утилиты находятся в стадии разработки и часто модифицируются, поэтому я смотрюза что-то максимально гибкое и удобное

Ответы [ 6 ]

0 голосов
/ 28 сентября 2018

Согласно Импорт файлов из другой папки Добавление __init__.py в папку util приведет к тому, что python будет рассматривать его как пакет.Другая вещь, которую вы можете сделать, это использовать import util.geometry as geometry, а затем вы можете использовать geometry.rotate_coordinates(...), что также улучшает читабельность.

0 голосов
/ 27 сентября 2018

Если вы создаете файл setup.py для вашего util модуля, вы можете установить его просто с помощью pip.Это будет обрабатывать все для вас.После установки вы можете импортировать его через систему.

import util

pip install

# setup.py is in current folder
sudo -H pip3 install .

или, если сам модуль util находится в стадии разработки, вы можетеустановите его с помощью редактируемой опции -e.Затем он автоматически обновляет установку при внесении изменений в код.

sudo -H pip3 install -e .

Для администрирования проекта я рекомендую использовать git в качестве @Michael liv.предлагает, особенно если вы работаете в команде.

0 голосов
/ 27 сентября 2018

Другой вариант (я использовал этот подход в моем проекте):

Предположим, что проекты запускаются из файлов project1.py и project2.py соответственно.

Вверху этих файловВы можете добавить следующие операции импорта и действия:

import sys
import os

sys.path.append(os.path.join(os.getcwd(), os.pardir))

import your_other_modules

your_other_modules.py будет содержать следующее для наложения утилит

from utils import storage
from utils import geometry
# or from project2 import project2, etc..

Может быть, это не лучший способ, но просто как еще один вариант.Я надеюсь, что это будет полезно для кого-то.

0 голосов
/ 27 сентября 2018

PYTHONPATH переменная окружения может быть подходящим вариантом.Просто установите для нее местоположение папки проектов:

PYTHONPATH=/somepath/temp_projects

, и вы сможете использовать util следующим образом:

import util.geometry

util.geometry.rotate_coordinates(....)

Также это будет автоматически распознаваться PyCharm.

0 голосов
/ 26 сентября 2018

Использовать importlib.

import importlib, importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

geometry = module_from_file("geometry", "../temp_projects/utils/geometry.py")

geometry.rotate_coordinates(...)
0 голосов
/ 23 сентября 2018

Я считаю, что правильный маршрут будет полностью отличаться от того, что вы делаете сейчас.Каждый проект должен храниться в отдельном репозитории Git, общие модули должны быть добавлены как подмодули git .Как только эти проекты станут больше и сложнее (и, вероятно, будут), им будет легче управлять ими по отдельности.

Короче говоря

Структура проектов должна быть:

Project_1
  |- utils <submodule>
       |- storage.py
       |- geometry.py
  |- main.py

Project_2
  |- utils <submodule>
       |- storage.py
       |- geometry.py
  |- main.py

Работа с подмодулями

### Adding a submodule to an existing git directory
git submodule add <git@github ...> <optional path/to/submodule>

### Pulling latest version from master branch for all submodules
git submodule update --recursive --remote

### Removing submodule from project
# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the project's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

Дополнительные сведения https://git -scm.com / book / ru / v2 / Git-Tools-подмодули

...