2010-12-27 4 views
2

Angenommen, Sie haben eine Client/Server-Anwendung, sagen Sie eine Webserver-Komponente und eine qt GUI. Wie gestalten Sie Ihren Python-Code?Python-Client/Server-Projektcode-Layout

  • Pakete foo.server und foo.client?
  • Pakete fooserver und fooclient, mit beiden importieren von foocommon?
  • Alles zusammen ohne klare Unterscheidung?

Subpackages für Server- und Client-Code (foo.server und foo.client) scheint der beste Ansatz für mich zu haben, aber dann, wie Sie Ihre distutils Setup behandeln Sie, wenn Sie versendet nicht die Server-Code wollen zusammen mit dem Client-Code? Wenn du setuptools verwendest (würde ich lieber nicht), wie erschaffst du getrennte Eier?

Antwort

-1

Mit Subpackages für Server- und Client-Code (foo.server und foo.client) scheint der beste Ansatz für mich,

Warum? Kein einzelner Benutzer (außer Ihnen der Entwickler) wird jemals beide Seiten verwenden. Sie sind völlig getrennt.

aber wie gehen Sie dann mit Ihrem Setup für distutil um, wenn Sie nicht möchten, dass der Servercode zusammen mit dem Clientcode gesendet wird?

Genau. Sie sind fast völlig unabhängig.

Weitere Informationen finden Sie in anderen Client-Server-Anwendungen.

Das World Wide Web, zum Beispiel.

Der Apache HTTPD-Server und der Firefox-Browser haben keinen gemeinsamen Code, den ich sehen kann. Vielleicht ein paar zugrunde liegende Bibliotheken, aber sie sind eindeutig nicht htttpd.client und httpd.server. Sie sind eindeutig völlig getrennt.

Der Sendmail-Server und die pop/imap-Bibliotheken in Python scheinen völlig getrennt zu sein, mit fast nichts gemeinsam.

Der MySQL-Datenbankserver und die MySQLDB-Schnittstelle in Python scheinen völlig und vollständig voneinander getrennt zu sein.

Ich kann nirgendwo Beispiele von foo.server und foo.client sehen. Vielleicht könnten Sie ein Beispiel als Teil Ihrer Frage geben, um Ihr Denken zu diesem Thema zu klären.

0

buildbot hat sich entschieden, separate Pakete zu erstellen (für die master und die slave). In s ource control haben sie drei Ordner: Common, Master und Slave (plus Dokumentation).

0

Ich mag Namespaces, also ja. foo.client und foo.server und foo.common und foo.anythingelse, die separat verwendet werden können. Aber es ist alles eine Frage des Geschmacks, wirklich.

Und ich würde sie als separate Pakete freigeben, und ja, ich würde Distribute verwenden.

0

Jetzt bin ich nur Setuptools (wirklich distribute), also bin ich, dass Code in meinen Projekten verwenden:

setup.py:

from setuptools import find_packages, setup 

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

Alle __init__.py Dateien im Namensraum-Module :

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

Und echte __init__.py Datei wie folgt aussieht:

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()