扭曲的插件错误
Twisted plugin error
A 创建了一个非常简单的扭曲应用程序,它启动 TCP 协议并回显您在 STDIN 中键入的内容。
我现在正在尝试创建一个 twistd
插件,以便能够以这种方式 运行 我的应用程序:echo start
或 twistd -n echo
当 运行ning twistd -n echo
一切正常时,当使用 echo start
命令时我得到错误:/home/vagrant/.env/bld/bin/echo: Unknown command: echo
这是我的代码:
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))
twisted/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,)
这是我的 virtualenv 设置:
(bld)vagrant@/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)
我在命令前加上了_ep_和_bld_因为我不确定在通过twistd或通过直接调用 entry_point,但我已经尝试了任何可能的组合,但都没有成功...
当我 运行 _ep_echo start
我得到:
[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
如果我用 _ep_echo
替换 _bld_echo
也是如此。
查看输出时有一点很奇怪:twistd 没有注册 echo
子命令。
如果我 运行 twistd --help
我得到:
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
在那里你可以看到 echo
命令已注册。
这让我抓狂,有什么问题吗??
请注意,我 运行 python setup.py install
而不是 python setup.py develop
,后一个命令有效,但我不想 运行 在生产中
编辑
好的,在搜索了为什么 axiomatic start
起作用而不是我的 echo start
之后,我通过从安装中删除所有不需要的代码找到了原因,这里是我找到的(我不声称这是解决方案,我很想听听@glyph 对此的回答)
Axiom 和 Echo 之间的主要区别是 setup.py
中的这一行:
packages=find_packages() + ['twisted.plugins']
我没有将 + ['twisted.plugins']
添加到 packages line
,现在可以使用了,但仍然出现此错误:
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'
该插件有效,但我真的很想知道为什么我原来的安装方式不起作用...
感谢您对问题的详尽解释;我只需要一个小的调整就可以准确地重现它(在 echo/
中创建一个 __init__.py
以使其成为一个合适的包)。
首先,这是解决方法:
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
之所以可行,是因为当您编写这样的命令时,您正在做的是 包装 Twisted 插件的执行,这意味着args.extend
构建的合成命令行是 Twisted 插件的 tapname
,与 twistd
命令行相同.
希望大家清楚为什么这是 _plgn_echo
。
我还必须赞扬您添加这些前缀以清楚地尝试清楚地理解 哪个 名称,特别是在代码的每个区域中都被引用。假设这个答案对你有意义,那么你对这里的代码的理解会比你在任何地方都卡住 echo
时更好,即使它一开始碰巧有效 :-).
A 创建了一个非常简单的扭曲应用程序,它启动 TCP 协议并回显您在 STDIN 中键入的内容。
我现在正在尝试创建一个 twistd
插件,以便能够以这种方式 运行 我的应用程序:echo start
或 twistd -n echo
当 运行ning twistd -n echo
一切正常时,当使用 echo start
命令时我得到错误:/home/vagrant/.env/bld/bin/echo: Unknown command: echo
这是我的代码:
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))
twisted/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,)
这是我的 virtualenv 设置:
(bld)vagrant@/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)
我在命令前加上了_ep_和_bld_因为我不确定在通过twistd或通过直接调用 entry_point,但我已经尝试了任何可能的组合,但都没有成功...
当我 运行 _ep_echo start
我得到:
[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
如果我用 _ep_echo
替换 _bld_echo
也是如此。
查看输出时有一点很奇怪:twistd 没有注册 echo
子命令。
如果我 运行 twistd --help
我得到:
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
在那里你可以看到 echo
命令已注册。
这让我抓狂,有什么问题吗??
请注意,我 运行 python setup.py install
而不是 python setup.py develop
,后一个命令有效,但我不想 运行 在生产中
编辑
好的,在搜索了为什么 axiomatic start
起作用而不是我的 echo start
之后,我通过从安装中删除所有不需要的代码找到了原因,这里是我找到的(我不声称这是解决方案,我很想听听@glyph 对此的回答)
Axiom 和 Echo 之间的主要区别是 setup.py
中的这一行:
packages=find_packages() + ['twisted.plugins']
我没有将 + ['twisted.plugins']
添加到 packages line
,现在可以使用了,但仍然出现此错误:
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'
该插件有效,但我真的很想知道为什么我原来的安装方式不起作用...
感谢您对问题的详尽解释;我只需要一个小的调整就可以准确地重现它(在 echo/
中创建一个 __init__.py
以使其成为一个合适的包)。
首先,这是解决方法:
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
之所以可行,是因为当您编写这样的命令时,您正在做的是 包装 Twisted 插件的执行,这意味着args.extend
构建的合成命令行是 Twisted 插件的 tapname
,与 twistd
命令行相同.
希望大家清楚为什么这是 _plgn_echo
。
我还必须赞扬您添加这些前缀以清楚地尝试清楚地理解 哪个 名称,特别是在代码的每个区域中都被引用。假设这个答案对你有意义,那么你对这里的代码的理解会比你在任何地方都卡住 echo
时更好,即使它一开始碰巧有效 :-).