2013-02-28 6 views
3

Я изучаю использование витой (последняя версия 12.3.0), как способ сделать небольшую обработку на стороне сервера для мобильного приложения.twisted Using Processes

Мое первое совпадение состоит в том, чтобы запустить команду «хвост» в файле журналов и доставить постобрабованные найденные строки в мобильное приложение. Это должно быть легко ...

Сейчас в документации на сайте TwistedMatrix есть «с использованием процессов» страница, где я получил следующий код:


from twisted.internet import protocol, utils, reactor 
from twisted.python import failure 
from cStringIO import StringIO 

class CommandRunner(protocol.Protocol): 

    #command = "ls /" 
    command = "tail -n 100 /var/log/system.log" 

    def connectionMade(self): 
     output = utils.getProcessOutput(self.command) 
     output.addCallbacks(self.writeResponse, self.noResponse) 

    def writeResponse(self, resp): 
     self.transport.write(resp) 
     self.transport.loseConnection() 

    def noResponse(self, err): 

     print err 
     self.transport.write("Houston, we have an error!\n") 
     self.transport.loseConnection() 


if __name__ == '__main__': 
    f = protocol.Factory() 
    f.protocol = CommandRunner 
    reactor.listenTCP(10999, f) 
    reactor.run() 

Это 99,9% идентично к опубликованному фрагменту кода в разделе «Doing it the Easy Way». Единственное изменение - команда оболочки, которую должен выполнить скрученный (на моем Mac у меня нет команды фортуны).

После запуска образца кода, когда я пытаюсь подключиться на 10999 порт из второго терминала с телнет я получаю эту ошибку:

[Failure instance: Traceback (failure with no frames): : got stderr: 'Upon execvpe tail -n 100 /var/log/system.log [\'tail -n 100 /var/log/system.log\'] in environment id 4315532016\n:Traceback (most recent call last):\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Twisted-12.3.0-py2.7-macosx-10.6-intel.egg/twisted/internet/process.py", line 420, in _fork\n executable, args, environment)\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Twisted-12.3.0-py2.7-macosx-10.6-intel.egg/twisted/internet/process.py", line 466, in _execChild\n os.execvpe(executable, args, environment)\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 353, in execvpe\n _execvpe(file, args, env)\n File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 368, in _execvpe\n func(file, *argrest)\nOSError: [Errno 2] No such file or directory\n']

Я не вижу каких-либо очевидных причин, почему код должен подать с [Errno 2] нет такого файла или каталога \ п '] ошибка ..

Тиа

ответ

5

программа вы хотите запустить не „хвост“. Вы хотите передать несколько аргументов: «-n», «100» и «/var/log/system.log».

Вместо этого ваш код запускает программу «tail -n 100 /var/log/system.log», которая, по-видимому, не существует в вашей системе (я бы этого не ожидал).

Правильное использование getProcessOutput должен пройти программу отдельно от списка аргументов:

getProcessOutput("tail", ["-n", "100", "/var/log/system.log"]) 
+1

Jean Paul, спасибо !! На Mac (или в другом месте) явно нет «tail -n 100 /var/log/system.log» ... Исправление проблемы с вызовом getProcessOutput устраняет проблему! Спасибо, Aldo – aaberga