Python 如何避免twisted tac文件中的导入错误?

Python 如何避免twisted tac文件中的导入错误?,python,twisted,Python,Twisted,我有一个twisted tac文件(twisted_service.py),其中有一个代码: from twisted.application import service # application.py file in the same dir from .application import setup_reactor class WebsocketService(service.Service): def startService(self): servic

我有一个twisted tac文件(twisted_service.py),其中有一个代码:

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()
我使用
twisted-noy twisted_service.py
命令来运行twisted服务。它一直在为twisted 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
未处理的错误
回溯(最近一次呼叫最后一次):
文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/application/app.py”,第662行,正在运行
runApp(配置)
runApp中的文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/scripts/twistd.py”,第25行
_SomeApplicationRunner(config.run())
文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/application/app.py”,第380行,正在运行
self.application=self.createOrGetApplication()
文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/application/app.py”,第445行,位于createOrGetApplication中
application=getApplication(self.config,密码短语)
---  ---
getApplication中的文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/application/app.py”,第456行
application=service.loadApplication(文件名、样式、密码短语)
loadApplication中的文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/application/service.py”,第412行
application=sob.loadValueFromFile(文件名“application”)
loadValueFromFile中的文件“/home/kalombo/.virtualenvs/dev/local/lib/python2.7/site packages/twisted/persistend/sob.py”,第177行
评估(代码对象,d,d)
文件“twisted_service.py”,第3行,在
from.application import setup\u reactor
exceptions.ImportError:没有名为application的模块
如何正确运行twisted或import模块?

我在这里找到了答案

这是Twisted 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


但我还没有找到更好的方法。。。。我认为这不是很好。

这段代码来自哪里?来自.application的
看起来可能是错误的,但我不知道您的代码。我已更新了问题