2016-02-23 14 views
5

Napisałem Twisted bin plik, który jest rozmieszczony na /usr/bin podczas deployement aplikacji na przykładzie Axiom przewidzianego na StackOverflow gdzie indziej (nie pamiętam gdzie), projekt może być found here.Twisted problem skrypt

Moim problemem jest to, że podczas procesu python setup.py install zainstalowana plik bin jest inny niż ten z pakietu 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')) 

, a drugi nie działa, gdy powołując go z powłoki bash: myapp start

pojawia się następujący błąd: unknow command myapp

Jeśli używam python setup.py develop zamiast python setup.py install wszystko działa sprawnie.


mam skonfigurować małą aplikację testową, który uruchamia usługę TCP na porcie 1234:

  • polecenie twistd fingerdziała, usługa rozpoczyna
  • komendę fingerize start (inną nazwę na celu , aby na pewno nie wywoływać niewłaściwego) nie działa

Oto kod:

bin/fingerize

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

skręcone/plugins/finger_plugin.py

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

palec/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()) 

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

I kiedy zadzwonić fingerize start uzyskać: /code/test/bin/fingerize: Unknown command: finger (test jest virtualenv)

+0

Problem dotyczy instalatora 'setup.py', który nie został dołączony. – Glyph

+0

oups przepraszam, dodam go teraz, jest głęboko zainspirowany 'Twisted' one – kitensei

+0

' txmyapp.python.dist' nie ma znaczenia, funkcja 'verifyInstall()' sprawdza tylko foldery i 'raise IOError' jeśli nie zostanie znaleziony. – kitensei

Odpowiedz

0

Ponieważ używasz setuptools w swojej setup.py, można użyć nowszej entry_points słowo kluczowe, tak jak poniżej:

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

zamiast słowa kluczowego scripts.

Uwaga: jeśli python setup.py install zostanie uruchomiony w virtualenv, skrypt zostanie umieszczony w env/bin/fingerize (zakładając, że twój folder virtualenv to env).

Jest to dobry sposób, aby takie „aplikacji Pythona”, a następnie dostępne na całym świecie (w jakimś celu wdrożenia), a ich wewnętrzne mechanika nie koliduje z systemem applciations Python, jest użycie pipsi (pip install pipsi) (wykonane przez faceta który opracował kolbę). Został zaprojektowany w celu ujawnienia plików wykonywalnych projektu w systemie i ma wszystko inne ukryte w swoim virtualenv.

Więcej informacji na temat pisania/konfigurowania/dystrybucji pakietów Pythona można znaleźć w przewodniku packaging.python.org.

+0

Próbowałem użyć zarówno 'scripts' i' entry_points', ale nadal otrzymuję ten sam błąd. Jestem świadomy skryptów virtualenv reż. – kitensei

+0

czy mógłbyś spróbować '/ code/test/bin/fingerize' i' fingerize'? Mogą być inne. – Ivo

+0

Testowałem już teraz i mam dokładnie ten sam problem. Jeśli uruchamiasz skrypt w sposób podany, działa on dla Ciebie? – kitensei

Powiązane problemy