2016-02-23 6 views
5

ich eine verdrehte bin Datei geschrieben haben, die auf /usr/bin während der Anwendung deployement eingesetzt wird, basierend auf dem Axiom Beispiel an anderer Stelle auf Stackoverflow (ich weiß nicht mehr wo), kann das Projekt found here sein.Twisted-Skript Ausgabe

Mein Problem ist, dass während des python setup.py install Prozess, der installierte bin-Datei als die von Axiom-Paket unterscheidet:

/usr/bin/axiomatischen

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

und diese funktioniert nicht, wenn Aufruf aus der Bash-Shell: myapp start

ich die folgende Fehlermeldung erhalten: unknow command myapp

Wenn ich python setup.py develop statt python setup.py install alles funktioniert reibungslos verwenden.


Ich habe Setup eine kleine Test-Anwendung, die einen TCP-Dienst auf Port beginnt 1234:

  • der Befehl twistd fingerarbeitet, der Dienst gestartet werden
  • der Befehl fingerize start (verschiedene Namen absichtlich , um sicher nicht den falschen Anruf) funktioniert nicht

Hier ist der Code:

bin/fingerize

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

verdrillten/Plugins/finger_plugin.py

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

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

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

Und wenn ich fingerize start nenne ich bekommen: /code/test/bin/fingerize: Unknown command: finger (Test ist ein virtualenv)

+0

Das Problem ist mit Ihrem 'setup.py', das Sie nicht enthalten haben. – Glyph

+0

ups Tut mir leid, ich füge es jetzt hinzu, es ist tief inspiriert von 'Twisted' one – kitensei

+0

Die' txmyapp.python.dist' ist irrelevant, die 'verifyInstall() 'Funktion sucht nur nach Ordnern und' raise IOError' falls nicht gefunden. – kitensei

Antwort

0

Da Sie Setuptools in Ihrem setup.py verwenden, können Sie die neuere entry_points Schlüsselwort verwenden, etwa so:

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

anstelle des Schlüsselwortes scripts.

Hinweis wenn python setup.py install in einem virtualenv ausgeführt wird, wird es das Skript in env/bin/fingerize setzen (Ihren virtualenv Ordner unter der Annahme env).

Ein schöner Weg, um solche „Python-Anwendungen“, dann global verfügbar (für einige Stationierung Zweck) zu machen, während ihre innere Mechanik mit Ihrem System Python applciations nicht stört, ist pipsi (pip install pipsi) (von dem Typ zu verwenden, wer entwickelte Flasche). Es wurde entwickelt, um nur die ausführbaren Dateien des Projekts dem System zur Verfügung zu stellen und alles andere in seinem eigenen virtualenv versteckt zu halten.

Weitere Informationen zum Schreiben/Konfigurieren/Verteilen von Python-Paketen finden Sie im Handbuch packaging.python.org.

+0

Ich habe versucht, sowohl 'scripts' als auch' entry_points' zu verwenden, aber ich bekomme immer noch den gleichen Fehler. Ich bin mir der Virtualenv-Skripte Dir bewusst. – kitensei

+0

könnten Sie versuchen, '/ code/test/bin/fingerize' und' fingerize' zu ​​verwenden? Sie könnten anders sein. – Ivo

+0

Ich habe jetzt getestet und ich habe genau das gleiche Problem. Wenn Sie das Skript wie angegeben ausführen, funktioniert es für Sie? – kitensei