5

根据 StackOverflow 上其他地方提供的示例(我不记得在哪里),我编写了一个在应用程序部署期间部署的 Twistedbin文件,该项目可以在此处找到/usr/binAxiom

我的问题是,在此python setup.py install过程中,安装的 bin 文件与 Axiom 包中的不同:

/usr/bin/公理

#!/code/venv/bin/python
from axiom.scripts import axiomatic
axiomatic.main()

/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'))

而后者在从 bash shell 调用时不起作用:myapp start

我收到以下错误:unknow command myapp

如果我使用python setup.py develop而不是python setup.py install一切顺利。


我已经设置了一个在端口 1234 上启动 tcp 服务的小测试应用程序:

  • 命令twistd finger 有效,服务启动
  • 该命令fingerize start(故意使用不同的名称,以确保不会调用错误的名称)不起作用

这是代码:

装箱/手指

#!/usr/bin/python
from finger import tap
tap.main()

扭曲/插件/finger_plugin.py

from twisted.application.service import ServiceMaker
Finger = ServiceMaker('Finger', 'finger.plugins', 'blah', 'finger')

手指/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())

手指/点击.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))

安装程序.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)

当我打电话时,fingerize start我得到:(/code/test/bin/fingerize: Unknown command: finger测试是一个虚拟环境)

4

1 回答 1

0

由于您在 中使用 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 应用程序”在全球范围内可用(用于某些部署目的),而它们的内部机制不会干扰您的系统 python 应用程序的一个好方法是使用pipsi ( pip install pipsi)(由开发烧瓶的人制作)。它旨在仅向系统公开项目的可执行文件,并将其他所有内容都隐藏在自己的 virtualenv 中。

您可以在 Packaging.python.org指南中了解更多关于如何编写/配置/分发 python 包的信息

于 2016-03-08T09:17:07.313 回答