Python客户端/服务器项目代码结构

2 投票
4 回答
531 浏览
提问于 2025-04-16 09:06

假设你有一个客户端/服务器的应用程序,比如一个网页服务器和一个QT图形界面。你应该如何组织你的Python代码呢?

  • 用包名foo.server和foo.client吗?
  • 用包名fooserver和fooclient,然后两个包都从foocommon导入吗?
  • 把所有东西放在一起,没有明确的区分吗?

我觉得为服务器和客户端代码分别创建子包(foo.server和foo.client)是最好的方法。但是,如果你不想把服务器代码和客户端代码一起打包,应该如何处理你的distutils设置呢?如果你使用setuptools(我不太想用),那怎么创建独立的包呢?

4 个回答

0

现在我只使用setuptools(其实是distribute),所以我在我的项目中使用这段代码:

setup.py文件:

from setuptools import find_packages, setup

setup(
    name = "foo.common",
    version = __import__("foo.common", fromlist=[""]).__version__,
    packages = find_packages(),
    namespace_packages = ["foo"]
)

所有命名空间模块中的__init__.py文件:

# this is a namespace package
try:
    import pkg_resources
    pkg_resources.declare_namespace(__name__)
except ImportError:
    import pkgutil
    __path__ = pkgutil.extend_path(__path__, __name__)

而真正的__init__.py文件看起来是这样的:

VERSION = (0, 1, 0, "dev")

def get_version():
    if VERSION[3] != "final":
        return "%s.%s.%s%s" % (VERSION[0], VERSION[1], VERSION[2], VERSION[3])
    else:
        return "%s.%s.%s" % (VERSION[0], VERSION[1], VERSION[2])

__version__ = get_version()
0

我喜欢使用命名空间,所以我觉得可以这样做。比如说,foo.client、foo.server、foo.common,还有其他任何可以单独使用的东西。其实这完全是个人喜好。

而且我会把它们作为不同的包发布,没错,我会使用Distribute工具。

-1

我觉得把服务器和客户端的代码放在不同的子包里(比如 foo.server 和 foo.client)是最好的做法。

为什么呢?除了你这个开发者,没有哪个用户会同时使用这两个部分。它们是完全独立的。

但是如果你不想把服务器的代码和客户端的代码一起打包,那你该怎么处理你的 distutils 设置呢?

没错,它们几乎没有关系。

想要了解更多,可以看看其他的客户端-服务器应用。

比如说,万维网。

Apache HTTPD 服务器和 Firefox 浏览器之间似乎没有任何共同的代码。我能看到的可能只有一些底层的库,但它们显然不是 htttpd.client 和 httpd.server。它们是完全分开的。

Sendmail 服务器和 Python 中的 pop/imap 库看起来也是完全分开的,几乎没有任何共同点。

MySQL 数据库服务器和 Python 中的 MySQLDB 接口似乎也是完全分开的,几乎没有任何共同点。

我没有看到任何 foo.server 和 foo.client 的例子。也许你可以在提问时分享一个例子,帮助大家更好地理解你在这个问题上的想法。

撰写回答