Twisted 插件在 Ubuntu 12.04 和 18.04 中有不同的结果

Twisted plugin has different result in Ubuntu 12.04 and 18.04

我正在基于 Twisted 的插件方法设计一个简单的 LoRaWAN UDP 服务器。它在两台 PC 上给了我不同的结果。

  1. 阿里云ECS, Ubuntu 12.04(32bit), Python 2.7.3, Twisted 15.0.0
  2. 物理 PC,Ubuntu18.04(64 位),Python2.7.15,Twisted 17.9.0

我的项目中有以下插件树。

$ tree lorawan_server/
lorawan_server/
├── LoRaWANPktFwd.py
├── run.sh
├── shutdown_twistd.sh
├── start_plugin_twistd.sh
└── twisted
    └── plugins
        └── LoRaWANPktFwd_plugin.py

LoRaWANPktFwd.py:

#!/usr/bin/env python
#coding: utf-8

from __future__ import print_function

import getopt
import os
import sys
import string
import struct
import binascii
import time
import uuid

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor, protocol, defer
from twisted.python import log
from twisted.enterprise import adbapi

class LoRaWANPktFwd(DatagramProtocol):

    def datagramReceived(self, data, addr):
        # A simple echo server
        self.transport.write(data, addr)

def main():
    log.startLogging(sys.stdout)
    reactor.listenUDP(1700, LoRaWANPktFwd())
    reactor.run()

if __name__ == "__main__":
    main()

LoRaWANPktFwd_plugin.py:

from zope.interface import implements
from twisted.application.service import IServiceMaker
from twisted.application import internet
from twisted.plugin import IPlugin
from twisted.python import usage
from LoRaWANPktFwd import LoRaWANPktFwd

class Options(usage.Options):
    optParameters = [["port","p", 1700, "The port number to listen on."]]

class LoRaWANPktFwdServiceMaker(object):
    implements(IServiceMaker, IPlugin)
    tapname = "LoRaWAN"
    description = "A Raw UDP-based LoRaWAN Packet Forwarder server."
    options = Options

    def makeService(self, options):
        return internet.UDPServer(int(options["port"]), LoRaWANPktFwd())

serviceMaker = LoRaWANPktFwdServiceMaker()

如果我输入:

twistd LoRaWAN

然后Ubuntu 18.04 会报错如下:

/usr/bin/twistd: Unknown command: LoRaWAN

并且 Ubuntu 12.04 将从 运行 开始,twistd.pid 和 twistd.log 在同一文件夹中创建。

我不知道为什么会这样。最新的 twisted 中有任何插件更新吗?或者它与 systemd 或其他东西有关?

Twisted 15 和 Twisted 17.9 在自动将 $PWD 包含在 sys.path 方面具有不同的行为。 Twisted 15 有,Twisted 17.9 没有。

将包含您的项目的路径添加到 PYTHONPATH(可能通过创建一个 virtualenv 并使用 pip 将您的项目安装到其中),Twisted 17.9 将找到代码,因此也会找到您的插件。