【问题标题】:Structure a repository with several Python applications使用多个 Python 应用程序构建存储库
【发布时间】:2020-01-16 09:29:06
【问题描述】:

导入共享相同代码资源的应用程序的最佳做法是什么?


假设我有一个自动股票交易员,其中包含两个独立运行的服务(不同的机器)。 这两项服务是:

  • 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

import 语句会是什么样子,我应该在运行应用程序时传递几个PYTHONPATHs 还是只有一个根?

例如在:

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

【问题讨论】:

标签: python structure pythonpath


【解决方案1】:

保持简单:尽可能使用绝对导入,如果不是到处使用的话。

要正确执行此操作,您需要弄清楚您的顶级 包(和模块)是什么。两种情况:

  • 要么您正确打包并安装您的项目,在这种情况下您从站点包导入;
  • 或者您没有安装项目,而是从当前工作目录导入。

看起来您属于第二种情况,并且您希望您的 顶级 包为 auto_tradercommon。所以像下面这样写你的导入:

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 代码正确地打包到一个可安装的项目中,并将其安装在 site packages 中并使用pip

【讨论】:

  • 这是一个很好的提醒,当使用python -m 时,您需要使用. 来正确处理您的目标应用程序而不是/
【解决方案2】:

由于您的代码布局是 3 个包......但可能只有 1 个代码包......您可以考虑做这样的事情

创建一个 Setup.py

它看起来像这样

#!/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'

【讨论】:

  • 当你说“有办法解决”时,你是指某种 CI/CD(比如 jenkins)吗?
  • CI/CD 将处理构建/测试/包构建....但是在部署时需要非常小心。您需要考虑如果出现问题会发生什么 - 基于 Web 的公司可能会选择部署 - 如果失败则回滚。使用 IT 支持其运营的公司 - 不太可能这样做 - 使用 Beta/Alpha 测试平台更有可能是部署方案。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多