如何使用三个使用通用模块的应用程序构建python项目

时间:2014-08-23 17:40:37

标签: python python-2.7 architecture module projects-and-solutions

我的项目包含三个Python应用程序。 应用1 是一款网络应用。 应用2 3 包含下载部分数据的脚本。

所有三个应用都需要使用包含"模型"的模块 Common 。 (保存到数据库的类)和常用设置。

我不知道如何构建这个项目。我可以创建三个目录,每个应用程序一个,并将 Common 三次复制到他们的目录中(似乎没有。)

想到的另一个想法是;创建一个主目录并将所有文件放在 Common 中,包括 __ init __。py 。然后,克里特三个子目录(子模块),每个应用程序一个。

另一种方法是使用pip安装 Common ,但这意味着每次我更改该模块中的某些内容时我都必须重新安装。

在之前的项目中,我使用的是.NET - 这个世界中的等价物将是一个包含四个项目的解决方案,其中一个是 Common

有什么建议吗?

4 个答案:

答案 0 :(得分:6)

我有一个像这样设置的类似项目

project_root/
    App1/
        __init__.py
    FlaskControlPanel/
        app.py
        static/
        templates/
    models/
        __init__.py
        mymodels.py

然后,我从project_root运行所有内容。我有一个小脚本(批处理或shell,取决于我的环境)设置PYTHONPATH=.以便导入正常工作。这样做是因为我通常使用PyCharm开发,其中导入"只是工作",但是当我部署最终产品时,路径与我在IDE中的路径不匹配。

PYTHONPATH设置为包含项目根目录中的所有内容后,即可进行标准导入。

例如,从我的FlaskControlPanel app.py,我有这一行:

from models.mymodels import Model1, Model2, Model3

从App1 __init__.py我有完全相同的导入声明:

from models.mymodels import Model1, Model2, Model3

当我在project_root目录中时,我可以通过命令行(在Windows中)运行Flask应用程序来启动它:

setlocal
SET PYTHONPATH=.
python FlaskControlPanel\app.py

setlocal用于确保仅为此会话修改PYTHONPATH

答案 1 :(得分:1)

我喜欢这种方法

projects/
  __init__.py
  project1/
    __init__.py
  project2/
    __init__.py
  lib1/
    __init__.py
    libfile.py
  lib2/
    __init__.py

所以,我需要进入项目文件夹。 要开始一个项目,请使用

python -m project_name

这使我可以轻松地从任何外部库导入,如

from lib1.libfile import [imoprt what you want]

from lib1 import libfile

答案 2 :(得分:0)

我会创建一个这样的结构:

project_root/
    app1/
        __init__.py
        script.py
    common/
        __init__.py
        models.py (all "common" models)

APP1 / script.py

import os, sys

# add parent directory to pythonpath
basepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')
if basepath not in sys.path:
    sys.path.append(basepath)

from common.models VeryCommonModel
print VeryCommonModel

如果您不想在运行时设置python路径,请在运行脚本之前设置python路径:

$ export PYTHONPATH=$PYTHONPATH:/path/to/project_root

然后你可以这样做:

python app1/script.py

答案 3 :(得分:0)

从您的应用制作标准Python模块。我推荐像这样的结构:

apps/
    common/
        setup.py
        common/
            __init__.py
            models.py
    app1/
        setup.py
        app1/
            __init__.py
            models.py
project/
requirements.txt

app common的基本setup.py:

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(
    name='common',
    version='1.0.0',
    packages=find_packages(),
    zip_safe=False,
)

为其他应用制作类似的setup.py。

在requirements.txt中为您的应用设置可编辑的“-e”选项:

-e apps/common
-e apps/app1

使用pip安装需求:

$ pip install -r requirements.txt

可编辑选项意味着源文件将链接到Python环境中。您的应用程序源文件的任何更改都将立即生效,无需重新安装。

现在,您可以在任何地方(在其他应用程序,项目文件中......)从常用应用程序(或任何其他应用程序)导入模型。