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 ...
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