5

StackOverflow の他の場所で提供されている例に基づいて、アプリケーションのデプロイ中にデプロイされる Twistedbinファイルを作成しました(場所は覚えていません)。プロジェクトはhereにあります。/usr/binAxiom

私の問題は、python setup.py installプロセス中に、インストールされた bin ファイルが Axiom パッケージのものとは異なることです。

/usr/bin/axiomatic

#!/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 シェルから呼び出すと機能しません。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()

ツイスト/plugins/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())

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

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)

そして、私が呼び出すと、次のようfingerize startになります: /code/test/bin/fingerize: Unknown command: finger(test is a virtualenv)

4

1 に答える 1

0

で setuptools を使用しているため、次のように newer キーワードsetup.pyを使用できます。entry_points

entry_points={ 'console_scripts': [ 'fingerize=finger.tap:main', ], },

scriptsキーワードの代わりに。

python setup.py installを virtualenv で実行すると、スクリプトが配置されることに注意env/bin/fingerizeしてください (virtualenv フォルダーが であると仮定しますenv)。

そのような " pythonアプリケーション" をグローバルに(何らかの展開目的で) 利用できるようにする良い方法は、それらの内部機構がシステムの python アプリケーションに干渉しないようにすることpip install pipsiです。プロジェクトの実行可能ファイルのみをシステムに公開し、それ以外はすべて独自の virtualenv に格納するように設計されています。

pythonパッケージを作成/構成/配布する方法の詳細については、packages.python.orgガイドを参照してください。

于 2016-03-08T09:17:07.313 に答える