1

サーバーをアプリケーションとして実行したいと考えています。そのために、 (オブジェクトMyServer(name, port, host, testMode=False)から継承する) クラスがあります。DatagramProtocol

別のファイルで、サーバーを作成して起動するためのコマンドをいくつか作成しました。多かれ少なかれ、次のようになります。

from twisted.application import service, internet

name, port, host = #read from database

server = MyServer(name, port, host)
udp_server = internet.UDPServer(port, server)
application = service.Application("MyServer")
udp_server.setServiceParent(application)

values name, port、およびhostデータベースから読み取ります。サーバーを as で起動する'twistd -y my_server_run.py'と、すべてが完璧に動作します。

ただし、サーバーをテスト モードと標準モードの 2 つのモードで起動できるようにしたいと考えています。したがって、コマンドラインから読み取った引数をオブジェクトにパラメーターとして渡したいと思います。それらをsys.argvとして解析できないという情報を見つけましたが、実装する必要があるusage.Optionsため、次のようにしました。

from twisted.application import service, internet
from twisted.python import usage

class Options(usage.Options):
    optParameters = [["test", "t", False, "The client test mode"]]


options = Options()
name, port, host = #read from database

try:
    options.parseOptions()
    server = MyServer(name, port, host, testMode=options['test'])
    udp_server = internet.UDPServer(port, server)
    application = service.Application("MyServer")
    udp_server.setServiceParent(application)

次に、サーバーを次のように実行します。

'twistd -y run_client.py --test True'

ただし、エラーが発生します:

option -y not recognized
Unhandled Error
out: Traceback (most recent call last):
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/application/app.py", line 648, in run
out:     runApp(config)
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/scripts/twistd.py", line 25, in runApp
out:     _SomeApplicationRunner(config).run()
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/application/app.py", line 379, in run
out:     self.application = self.createOrGetApplication()
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/application/app.py", line 444, in createOrGetApplication
out:     application = getApplication(self.config, passphrase)
out: --- <exception caught here> ---
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/application/app.py", line 455, in getApplication
out:     application = service.loadApplication(filename, style, passphrase)
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/application/service.py", line 411, in loadApplication
out:     passphrase)
out:   File "/usr/local/lib/python2.7/dist-packages/twisted/persisted/sob.py", line 224, in loadValueFromFile
out:     value = d[variable]
out: exceptions.KeyError: 'application'
out: Failed to load application: 'application'
out: Could not find 'application' in the file. To use 'twistd -y', your .tac

私は自分が間違っていることを見つけることができません。どんな提案も非常に役に立ちます。

4

1 に答える 1

0

残念ながら、この質問で既に説明したように、 をservice.Application使用することはできません。usage.Options

経由でサーバーを起動する場合、オプションを使用できます。

python run_client.py --test True

または、ねじれたプラグイン (TAP ファイル) を使用している場合。

ねじれたアプリケーション構成ファイルを使用します。このファイルでサーバーを構成すると想定され、運用システムでサービスとして起動されます。そのため、オプションを設定ファイルまたはデータベースに保存して、起動時に読み取ることは問題ありません。

于 2016-12-05T13:17:18.627 に答える