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 finger
dział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)
Problem dotyczy instalatora 'setup.py', który nie został dołączony. – Glyph
oups przepraszam, dodam go teraz, jest głęboko zainspirowany 'Twisted' one – kitensei
' txmyapp.python.dist' nie ma znaczenia, funkcja 'verifyInstall()' sprawdza tylko foldery i 'raise IOError' jeśli nie zostanie znaleziony. – kitensei