Структура хранилища с несколькими Python приложениями - PullRequest
1 голос
/ 16 января 2020

Каковы лучшие практики для импорта приложений, которые используют одни и те же ресурсы кода?


Представьте, что у меня есть автоматический биржевой маклер, который содержит две службы, которые работают независимо (на разных машинах). Две службы:

  • collection_service - собирает цены на акции каждую минуту и ​​сохраняет их в SQL базе данных
  • decision_making - принимает решение каждые десять минут (на основе на собранные данные), или купить акции.

Желая сохранить SSOT , они оба используют одни и те же SQL настольные модели (скажем, SQLalchemy модели) Однако каждый из них имеет разные зависимости. Кроме того, все они используют код, написанный моей компанией в разных проектах.

Мой репозиторий выглядит следующим образом:

─my_companies_repo
    ├───auto_trader
    │   ├───collection
    │   │       main_collection.py
    │   │       requirements.txt
    │   │
    │   ├───db_manage
    │   │       sql_models.py
    │   │
    │   └───decision_making
    │           main_decision.py
    │           requirements.txt
    │
    └───common

Как будут выглядеть операторы импорта, если я пропущу несколько PYTHONPATH с при запуске приложения или один root?

Например, в:

main_decision.py

from auto_trader.db_manage.sql_models
# or pass two PYTHONPATH's (one for common and one for auto_trader) and do this:
from db_manage.sql_models

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Поскольку ваш код-макета состоит из 3 пакетов ... Но, возможно, всего в 1 пакете кода ... вы можете подумать о том, чтобы сделать что-то вроде этого

Создать файл Setup.py

It будет выглядеть примерно так

#!/usr/bin/env python

from setuptools import setup

setup(
    name='stocks',
    version='0.3',
    description='foo',
    author='bar',
    packages = ['my_companies_repo.auto_trader.collection',
                'my_companies_repo.auto_trader.db_manage',
              'my_companies_repo.auto_trader.decision_making'])

Первый шаг, если построить Python Дистрибутивный пакет

python setup.py sdist

Это только что созданный файл примерно такого типа

project/sdist/stocks-03.tar.gz 

Теперь вы перемещаете этот файл на свои 3 сервера, на которых эти части находятся

  • Коллекция
  • db_manage
  • принятия решений

Итак

scp /sdist/stocks-03.tar.gz server:~/

Теперь вы входите в эти машины - и затем устанавливаете

pip3 install stocks-03.tar.gz 

Вы должны сделать это на каждой машине (это утомительно - нужно было решить ... но я стараюсь упростить задачу).

На этом этапе одно и то же программное обеспечение теперь есть на всех машинах ...

Так как мы его запустим ....

на Коллекторной машине

python3 -m 'my_companies_repo.auto_trader.collection'  

на Решающей машине

python3 -m 'my_companies_repo.auto_trader.decision_making'
0 голосов
/ 16 января 2020

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

Чтобы сделать это правильно, вам необходимо выяснить, какие у вас пакеты верхнего уровня (и модули). ). Два случая:

  • либо вы правильно упаковываете и устанавливаете свой проект, в этом случае вы импортируете с пакетов сайта ;
  • или не устанавливаете свой проект, и вы импортируете из текущего рабочего каталога.

Похоже, что вы во втором случае, и вы хотите, чтобы ваши пакеты верхнего уровня были auto_trader и common. Итак, напишите ваш импорт следующим образом:

from auto_trader.db_manage import sql_models
from common import foo

Затем убедитесь, что текущий рабочий каталог my_companies_repo, а затем вызовите ваши основные модули так:

python3 -m auto_trader.collection.main_collection
python3 -m auto_trader.decision_making.main_decision

И, наконец, никогда измените переменную окружения PYTHONPATH. Если вы чувствуете, что вам нужно, то, скорее всего, вам следует потратить некоторое время на правильную упаковку кода Python в устанавливаемый проект и установить его в пакетах сайта с pip. * 1030. *

...