2016-03-21 11 views
1

A haben eine tote einfache verdrehte Anwendung erstellt, die ein TCP-Protokoll startet und Echo, was Sie in STDIN eingeben.Twisted Plugin-Fehler

ich jetzt versuchen, eine twistd Plugin erstellen zu können, meine Anwendung auf diese Weise auszuführen: echo start oder entweder twistd -n echo

Wenn twistd -n echo alles läuft wie erwartet funktioniert, wenn der echo start Befehl erhalte ich die Fehlermeldung: /home/vagrant/.env/bld/bin/echo: Unknown command: echo

Hier ist mein Code:

Echo/plugins.py

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

from twisted.application import internet 
from twisted.internet import endpoints 
from twisted.internet.protocol import Factory 
from twisted.python import usage 

from echo.protocol import EchoProtocol 


class Options(usage.Options): 
    optParameters = [['port', 'p', 1234, 'Service port.']] 


def makeService(options): 
    from twisted.internet import reactor 

    f = Factory() 
    f.protocol = EchoProtocol 

    ep = endpoints.TCP4ServerEndpoint(reactor, int(options['port'])) 
    return internet.StreamServerEndpointService(ep, f) 

Echo-/protocol.py

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

from twisted.internet.protocol import Protocol 


class EchoProtocol(Protocol): 
    def dataReceived(self, data): 
     self.transport.write('You entered: {data}'.format(data=data)) 

Echo-/tap.py

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

import sys 

from twisted.python import usage 
from twisted.scripts import twistd 


class Start(twistd.ServerOptions): 
    def parseOptions(self, args): 
     sys.argv[1:] = self.getArguments(args) 
     print('Starting echo service...') 
     twistd.run() 

    def getArguments(self, args): 
     args.extend(['--pidfile', self.parent.pid]) 
     args.extend(['_bld_echo']) 
     return args 


class Options(usage.Options): 
    pid = '/tmp/echo.pid' 
    subCommands = [['start', None, Start, 'Launch echo service.']] 


def main(argv=None): 
    o = Options() 
    try: 
     o.parseOptions(argv) 
    except usage.UsageError, e: 
     raise SystemExit(str(e)) 

verdrillten/Plugins/echo_plugin.py

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

from twisted.application.service import ServiceMaker 

Finger = ServiceMaker(
    'EchoServiceMaker', # name 
    'echo.plugins', # module 
    'Description blah-blah.', # description 
    '_plgn_echo') # tapname 

setup.py

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

from setuptools import find_packages 
from setuptools import setup 

setup(
    name='Echo', 
    version='0.0.1', 
    packages=find_packages(), 
    entry_points={ 
     'console_scripts': [ 
      '_ep_echo=echo.tap:main', 
     ], 
    }, 
    install_requires=[ 
     'Twisted==16.0.0', 
    ], 
    include_package_data=True, 
    zip_safe=False,) 

Hier mein virtualenv Setup:

(bld)[email protected]/code/echo $ pip list 
Echo (0.0.1) 
pip (1.4.1) 
setuptools (20.3.1) 
Twisted (16.0.0) 
wsgiref (0.1.2) 
zope.interface (4.1.3) 

ich meine Befehle mit _ep_ und _bld_, weil ich nicht sicher war, ob das Präfix haben, die man genannt wurden, als der Aufruf Programm durch twisted oder durch direkten Aufruf des entry_point, aber ich habe jede mögliche Kombination ohne Erfolg versucht ...

Wenn ich _ep_echo start laufen erhalte ich:

[twistd -help output...] 

twistd reads a twisted.application.service.Application out of a file and runs 
it. 
Commands: 
    conch   A Conch SSH service. 
    dns    A domain name server. 
    ftp    An FTP server. 
    inetd   An inetd(8) replacement. 
    mail    An email service 
    manhole   An interactive remote debugger service accessible via 
        telnet and ssh and providing syntax coloring and basic line 
        editing functionality. 
    manhole-old  An interactive remote debugger service. 
    news    A news server. 
    portforward  A simple port-forwarder. 
    procmon   A process watchdog/supervisor 
    socks   A SOCKSv4 proxy service. 
    telnet   A simple, telnet-based remote debugging service. 
    web    A general-purpose web server which can serve from a 
        filesystem or application resource. 
    words   A modern words server 
    xmpp-router  An XMPP Router server 

/home/vagrant/.env/bld/bin/_ep_echo: Unknown command: _bld_echo 

Das gleiche gilt, wenn ich _bld_echo mit _ep_echo ersetzen.

Eine Sache ist komisch, wenn man sich die Ausgabe anschaut: Der Twisted hat den echo Unterbefehl nicht registriert.

Wenn ich twistd --help laufen erhalte ich:

twistd reads a twisted.application.service.Application out of a file and runs 
it. 
Commands: 
    _plgn_echo  Description blah-blah. 
    conch   A Conch SSH service. 
    dns    A domain name server. 
    ftp    An FTP server. 
    inetd   An inetd(8) replacement. 
    mail    An email service 
    manhole   An interactive remote debugger service accessible via 
        telnet and ssh and providing syntax coloring and basic line 
        editing functionality. 
    manhole-old  An interactive remote debugger service. 
    news    A news server. 
    portforward  A simple port-forwarder. 
    procmon   A process watchdog/supervisor 
    socks   A SOCKSv4 proxy service. 
    telnet   A simple, telnet-based remote debugging service. 
    web    A general-purpose web server which can serve from a 
        filesystem or application resource. 
    words   A modern words server 
    xmpp-router  An XMPP Router server 

Und dort können Sie die echo Befehl registriert sehen.

Das macht mich verrückt, irgendwelche Ideen über was ist das Problem hier?

Beachten Sie, dass ich laufen python setup.py install und nicht python setup.py develop, letztere Befehl funktioniert, aber ich möchte nicht, dass in der Produktion laufen


EDIT

Ok nach der Suche, warum die axiomatic start gearbeitet und nicht meine echo start Ich fand den Grund durch Entfernen aller unnötigen Code aus der Installation und hier, was ich gefunden habe (ich behaupte nicht, das ist die Lösung, würde ich gerne @ hören Glyphe Antwort auf diese)

Der wesentliche Unterschied zwischen Axiom und Echo ist diese Linie in setup.py:

packages=find_packages() + ['twisted.plugins']

Ich habe nicht den + ['twisted.plugins'] Neben dem packages line und jetzt funktioniert es, aber es ist immer noch dieser Fehler passiert:

Unexpected error while writing cache file 
Traceback (most recent call last): 
    File "/home/vagrant/.env/bld/lib/python2.7/site-packages/Twisted-16.0.0-py2.7-linux-x86_64.egg/twisted/application/app.py", line 579, in parseOptions 
    usage.Options.parseOptions(self, options) 
    File "/home/vagrant/.env/bld/lib/python2.7/site-packages/Twisted-16.0.0-py2.7-linux-x86_64.egg/twisted/python/usage.py", line 262, in parseOptions 
    for (cmd, short, parser, doc) in self.subCommands: 
    File "/home/vagrant/.env/bld/lib/python2.7/site-packages/Twisted-16.0.0-py2.7-linux-x86_64.egg/twisted/application/app.py", line 596, in subCommands 
    for plug in sorted(plugins, key=attrgetter('tapname')): 
    File "/home/vagrant/.env/bld/lib/python2.7/site-packages/Twisted-16.0.0-py2.7-linux-x86_64.egg/twisted/plugin.py", line 213, in getPlugins 
    allDropins = getCache(package) 
--- <exception caught here> --- 
    File "/home/vagrant/.env/bld/lib/python2.7/site-packages/Twisted-16.0.0-py2.7-linux-x86_64.egg/twisted/plugin.py", line 185, in getCache 
    dropinPath.setContent(pickle.dumps(dropinDotCache)) 
exceptions.AttributeError: 'ZipPath' object has no attribute 'setContent' 

Das Plugin funktioniert, aber ich würde wirklich gerne wissen, warum meine ursprüngliche Art der Installation es nicht funktioniert hat ...

+0

Hoffentlich bezieht sich 'echo/plugins/py' eigentlich auf' echo/plugins.py'? Ich werde die Frage bearbeiten, um das zu reflektieren. (Wenn nicht: das ist dein Problem. :)) – Glyph

Antwort

1

Vielen Dank für eine extrem gründliche Erklärung Ihres Problems; Ich konnte es mit nur einer kleinen Optimierung genau reproduzieren (indem ich ein __init__.py innerhalb echo/ erstelle, um es ein richtiges Paket zu machen).

Zuerst ist hier die fix:

diff --git a/echo/tap.py b/echo/tap.py 
index d23571f..8e1ea84 100644 
--- a/echo/tap.py 
+++ b/echo/tap.py 
@@ -15,7 +15,7 @@ class Start(twistd.ServerOptions): 

    def getArguments(self, args): 
     args.extend(['--pidfile', self.parent.pid]) 
-  args.extend(['_bld_echo']) 
+  args.extend(['_plgn_echo']) 
     return args 

Der Grund, dass dies funktioniert, ist es das, was Sie tun, wenn Sie einen Befehl wie diesen zu schreiben ist Sie sind die Ausführung der Twisted-Plugin Einwickeln, die bedeutet, dass die Sache, die auf Ihrer synthetischen Befehlszeile von args.extend gebaut wird, der tapname des Twisted-Plugin ist, die gleiche Sache, die auf der twistd-Befehlszeile gehen würde.

Hoffentlich ist es klar, warum dies _plgn_echo ist.

Ich muss Sie auch auf das Hinzufügen dieser Präfixe deutlich zu versuchen, klar zu verstehen, , die Namen, besonders, wird in jedem Bereich des Codes bezeichnet werden. Unter der Annahme, dass diese Antwort für Sie Sinn ergibt, werden Sie den Code hier viel besser verstehen, als wenn Sie einfach nur irgendwo stecken geblieben wären, selbst wenn es zuerst passiert wäre :-).

+0

Ich verstehe völlig, aber ich habe immer noch den gleichen Fehler ... '/home/vagrant/.env/bld/bin/_ep_echo: Unbekannter Befehl: _plgn_echo', habe ich versucht um die ** argv ** -Liste zu loggen, und hier ist es: '['/home/vagrant/.env/bld/bin/_ep_echo', '--pidfile', '/tmp/echo.pid', '_plgn_echo' ] '. Der 'twistd' Hilfebefehl zeigt immer noch nicht den '_ * _ echo'-Befehl an, den ich geschrieben habe. – kitensei

+0

Ok, ich habe festgestellt, was fehlgeschlagen ist, bitte sieh dir meine Änderungen an und danke für deine Unterstützung :) – kitensei