如何避免twisted tac文件中的ImportError?

如何避免twisted tac文件中的ImportError?

问题描述:

我有一个代码扭曲TAC文件(twisted_service.py):如何避免twisted tac文件中的ImportError?

from twisted.application import service 
# application.py file in the same dir 
from .application import setup_reactor 


class WebsocketService(service.Service): 

    def startService(self): 
     service.Service.startService(self) 
     setup_reactor() 

application = service.Application("ws") 

ws_service = WebsocketService() 
ws_service.setServiceParent(application) 

这里是application.py文件,至极设置该反应器:

# -*- coding: utf-8 -*- 
from twisted.web.server import Site 
from twisted.web.static import Data 
from twisted.internet import reactor, defer 
from autobahn.twisted.resource import WebSocketResource 
from autobahn.twisted.websocket import WebSocketServerFactory 
from txsni.snimap import SNIMap 
from txsni.maputils import Cache 
from txsni.snimap import HostDirectoryMap 
from twisted.python.filepath import FilePath 
from tools.database.async import pg_conn 
from tools.database import makedsn 
from tools.config import main_db 
from tools.modules.external import flask_setup 


import tools.config as config 
import websockethandlers as wsh 
from pytrapd import TrapsListener 


PROTOCOLMAP = { 
    'portcounters': wsh.PortCounters, 
    'eqcounters': wsh.EquipmentCounters, 
    'settings': wsh.Settings, 
    'refresh': wsh.Refresher, 
    'montraps': wsh.TrapsMonitoring, 
    'fdbs': wsh.FdbParser, 
    'portstate': wsh.PortState, 
    'cable': wsh.CableDiagnostic, 
    'eqcable': wsh.EquipmentCableDiagnostic, 
    'igmp': wsh.Igmp, 
    'ipmac': wsh.IpMac, 
    'lldp': wsh.LLDPParser, 
    'alias': wsh.AliasSetup, 
    'ping': wsh.Ping 
} 


@defer.inlineCallbacks 
def setup_reactor(): 
    flask_setup() 
    yield pg_conn.connect(makedsn(main_db)) 
    root = Data("", "text/plain") 
    for key in PROTOCOLMAP: 
     factory = WebSocketServerFactory("wss://localhost:%s" % config.ws_port) 
     factory.protocol = PROTOCOLMAP[key] 
     resource = WebSocketResource(factory) 
     root.putChild(key, resource) 
    site = Site(root) 
    context_factory = SNIMap(
     Cache(HostDirectoryMap(FilePath(config.certificates_directory))) 
    ) 
    reactor.listenSSL(config.ws_port, site, context_factory) 
    traps_listener = TrapsListener() 
    traps_listener.listen_traps(config.trap_ip) 
    traps_listener.listen_messages(config.fifo_file) 

if __name__ == '__main__': 
    setup_reactor() 
    import sys 

    from twisted.python import log 
    log.startLogging(sys.stdout) 
    reactor.run() 

我使用twistd -noy twisted_service.py命令来运行扭曲的服务。它一直在为扭曲的16.3.2版本工作。升级到任何新版本后,我得到了错误:

Unhandled Error 
Traceback (most recent call last): 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/application/app.py", line 662, in run 
    runApp(config) 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/scripts/twistd.py", line 25, in runApp 
    _SomeApplicationRunner(config).run() 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/application/app.py", line 380, in run 
    self.application = self.createOrGetApplication() 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/application/app.py", line 445, in createOrGetApplication 
    application = getApplication(self.config, passphrase) 
--- <exception caught here> --- 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/application/app.py", line 456, in getApplication 
    application = service.loadApplication(filename, style, passphrase) 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/application/service.py", line 412, in loadApplication 
    application = sob.loadValueFromFile(filename, 'application') 
    File "/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site-packages/twisted/persisted/sob.py", line 177, in loadValueFromFile 
    eval(codeObj, d, d) 
    File "twisted_service.py", line 3, in <module> 
    from .application import setup_reactor 
exceptions.ImportError: No module named application 

我应该如何正常运行的扭曲或导入模块?

+0

此代码从哪里来? ''from .application''看起来可能是错的,但我不知道你的代码。 – allo

+0

我已更新该问题 – kalombo

我在这里找到了答案http://twistedmatrix.com/pipermail/twisted-python/2016-September/030783.html

这是扭曲的16.4.0的新功能。在以前的版本中,twistd脚本会自动将工作目录添加到系统路径,从16.4.0版我必须手动添加它。它可以在twisted_service.py文件中添加如下内容:

import os 
import sys 
TWISTED_DIR = os.path.dirname(os.path.abspath(__file__)) 
sys.path.append(TWISTED_DIR) 

我几乎找到了你的答案。如下所示:

import os 
import sys 

sys.path = [os.path.join(os.getcwd(), '.'), ] + sys.path 

只需将当前工作目录添加到sys.path。

但是我还没找到更好的方法....我觉得这不太好。