gpt4 book ai didi

python - 扭曲插件错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:06 24 4
gpt4 key购买 nike

A 创建了一个非常简单的扭曲应用程序,它启动 TCP 协议(protocol)并回显您在 STDIN 中键入的内容。

我现在正在尝试创建一个 twistd 插件,以便能够通过以下方式运行我的应用程序:echo starttwistd -n echo

运行 twistd -n echo 时,一切按预期工作,当使用 echo start 命令时,出现错误:/home/vagrant/.env/bld/bin/echo:未知命令: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_ 前缀,因为我不确定通过 twind 调用程序或直接调用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

如果我将 _bld_echo 替换为 _ep_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.pydevelop,后一个命令可以工作,但我不想在生产

<小时/>

编辑

好吧,在搜索了为什么 axiomatic start 有效而不是我的 echo start 后,我通过从安装中删除所有不需要的代码找到了原因,这里是我发现的(我并不声称这是解决方案,我很想听到@glyph对此的回答)

AxiomEcho 之间的主要区别是 setup.py 中的这一行:

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

我没有在packages行中添加+ ['twisted.plugins'],现在它可以工作了,但仍然发生此错误:

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 更好,即使它一开始碰巧起作用了:- )。

关于python - 扭曲插件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36129752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com