Python客户端/服务器项目代码结构
假设你有一个客户端/服务器的应用程序,比如一个网页服务器和一个QT图形界面。你应该如何组织你的Python代码呢?
- 用包名foo.server和foo.client吗?
- 用包名fooserver和fooclient,然后两个包都从foocommon导入吗?
- 把所有东西放在一起,没有明确的区分吗?
我觉得为服务器和客户端代码分别创建子包(foo.server和foo.client)是最好的方法。但是,如果你不想把服务器代码和客户端代码一起打包,应该如何处理你的distutils设置呢?如果你使用setuptools(我不太想用),那怎么创建独立的包呢?
4 个回答
现在我只使用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()
我喜欢使用命名空间,所以我觉得可以这样做。比如说,foo.client、foo.server、foo.common,还有其他任何可以单独使用的东西。其实这完全是个人喜好。
而且我会把它们作为不同的包发布,没错,我会使用Distribute工具。
我觉得把服务器和客户端的代码放在不同的子包里(比如 foo.server 和 foo.client)是最好的做法。
为什么呢?除了你这个开发者,没有哪个用户会同时使用这两个部分。它们是完全独立的。
但是如果你不想把服务器的代码和客户端的代码一起打包,那你该怎么处理你的 distutils 设置呢?
没错,它们几乎没有关系。
想要了解更多,可以看看其他的客户端-服务器应用。
比如说,万维网。
Apache HTTPD 服务器和 Firefox 浏览器之间似乎没有任何共同的代码。我能看到的可能只有一些底层的库,但它们显然不是 htttpd.client 和 httpd.server。它们是完全分开的。
Sendmail 服务器和 Python 中的 pop/imap 库看起来也是完全分开的,几乎没有任何共同点。
MySQL 数据库服务器和 Python 中的 MySQLDB 接口似乎也是完全分开的,几乎没有任何共同点。
我没有看到任何 foo.server 和 foo.client 的例子。也许你可以在提问时分享一个例子,帮助大家更好地理解你在这个问题上的想法。