2016-12-04 39 views
0

我想運行我的服務器作爲應用程序。爲此,我有一個MyServer(name, port, host, testMode=False)類(繼承自DatagramProtocol對象)。Twistd - 使用service.Application與選項來允許參數解析

在另一個文件中,我創建了一些命令來創建和啓動我的服務器。或多或少,它看起來像:

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) 

name, port,並且host我從數據庫中讀取。 我開始我的服務器爲'twistd -y my_server_run.py',一切都運行完美。

但是,我希望能夠啓動我的服務器進入模式:測試模式和標準模式。因此,我想將從命令行讀取的參數作爲參數傳遞給我的對象。我查到的資料,我無法分析他們作爲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 

我無法找出什麼我做錯了。任何建議都會非常有幫助。

回答

0

不幸的是service.Application不能與usage.Options一起使用,正如在this question中已經討論的那樣。

選項可以,如果你是通過

python run_client.py --test True 

啓動您的服務器,或者如果您使用雙絞線插件(TAP文件)中。

您使用twisted application configuration文件,假設您在此文件中配置服務器,它將作爲生產系統上的服務啓動。因此,將選項存儲在某些配置文件或數據庫中並在啓動期間讀取它們即可。