kit*_*sei 5 python twisted twistd
我在应用程序bin部署/usr/bin期间编写了一个Twisted 文件,基于AxiomStackOverflow 上其他地方提供的示例(我不记得在哪里),可以在这里找到项目.
我的问题是,在此python setup.py install过程中,安装的bin文件与Axiom包中的文件不同:
在/ usr/bin中/不言自明
#!/code/venv/bin/python
from axiom.scripts import axiomatic
axiomatic.main()
Run Code Online (Sandbox Code Playgroud)
在/ usr/bin中/ MYAPP
#!/code/venv/bin/python
# EASY-INSTALL-DEV-SCRIPT: 'MyApp==0.0.1','myapp'
__requires__ = 'MyApp==0.0.1'
__import__('pkg_resources').require('MyApp==0.0.1')
exec(compile(open(__file__).read(), __file__, 'exec'))
Run Code Online (Sandbox Code Playgroud)
从bash shell调用后者时后者不起作用: myapp start
我收到以下错误: unknow command myapp
如果我使用python setup.py develop而不是python setup.py install一切顺利.
我已经设置了一个小测试应用程序,它在端口1234上启动tcp服务:
twistd finger 有效,服务启动fingerize start(故意使用不同的名称,以确保不会调用错误的名称)不起作用这是代码:
斌/ fingerize
#!/usr/bin/python
from finger import tap
tap.main()
Run Code Online (Sandbox Code Playgroud)
扭转/插件/ finger_plugin.py
from twisted.application.service import ServiceMaker
Finger = ServiceMaker('Finger', 'finger.plugins', 'blah', 'finger')
Run Code Online (Sandbox Code Playgroud)
手指/ plugins.py
from twisted.application import internet
from twisted.internet import endpoints
from twisted.python import usage
from twisted.internet import protocol
class Options(usage.Options):
""" """
def makeService(options):
from twisted.internet import reactor
endpoint = endpoints.TCP4ServerEndpoint(reactor, 1234)
return internet.StreamServerEndpointService(
endpoint,
protocol.Factory())
Run Code Online (Sandbox Code Playgroud)
手指/ tap.py
import sys
from twisted.python import usage
from twisted.scripts import twistd
class Start(twistd.ServerOptions):
run = staticmethod(twistd.run)
def subCommands(self):
raise AttributeError()
subCommands = property(subCommands)
def parseOptions(self, args):
print(sys.argv)
print(args)
a = self.getArguments(args)
print(a)
sys.argv[1:] = a
print(sys.argv)
print('Starting finger service...')
self.run()
def getArguments(self, args):
args.extend(['--pidfile', self.parent.pid()])
args.extend(['finger'])
return args
class Options(usage.Options):
def subCommands():
def get(self):
yield ('start', None, Start, 'Launch finger service')
return get,
subCommands = property(*subCommands())
def pid(self):
return '/tmp/finger.pid'
def main(argv=None):
o = Options()
try:
o.parseOptions(argv)
except usage.UsageError, e:
raise SystemExit(str(e))
Run Code Online (Sandbox Code Playgroud)
setup.py
from setuptools import find_packages
from setuptools import setup
METADATA = dict(
name='Finger',
version='0.0.1',
packages=find_packages(),
scripts=['bin/fingerize'],
install_requires=[
'Twisted >= 15.5.0',
],
include_package_data=True,
zip_safe=False,
)
setup(**METADATA)
Run Code Online (Sandbox Code Playgroud)
当我打电话给fingerize start我时:( /code/test/bin/fingerize: Unknown command: finger测试是一个虚拟的)
由于您在 中使用 setuptools setup.py,因此可以使用 newerentry_points关键字,如下所示:
entry_points={
'console_scripts': [
'fingerize=finger.tap:main',
],
},
而不是scripts关键字。
请注意,如果python setup.py install在 virtualenv 中运行,它会将脚本放入其中env/bin/fingerize(假设您的 virtualenv 文件夹是env)。
使此类“Python 应用程序”在全球范围内可用(出于某些部署目的)的一个好方法是使用pipsi ( pip install pipsi) (由开发 Flask 的人制作),同时它们的内部机制不会干扰您的系统 Python 应用程序。它旨在仅向系统公开项目的可执行文件,并将其他所有内容隐藏在其自己的 virtualenv 中。
您可以在Packaging.python.org指南中了解有关如何编写/配置/分发 Python 包的更多信息。
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |