twisted使用进程

时间:2013-02-28 15:27:27

标签: process twisted

我正在学习使用twisted(最新的12.3.0版本),作为一种为移动应用程序进行简单服务器端处理的方法。

我的第一个主要是在日志文件上运行'tail'命令,并将后处理的找到的行传递给移动应用程序。这应该很容易......

现在在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%。唯一的变化是扭曲应该执行的shell命令(在我的Mac上我似乎没有命运)。

当我尝试使用telnet从第二个终端连接10999端口时启动示例代码后出现此错误:

  

[失败实例:回溯(无框架失败)::得到了stderr:'在   execvpe tail -n 100 /var/log/system.log [\'tail -n 100   /var/log/system.log \']在环境id 4315532016 \ n:Traceback(大多数   最近的呼叫最后):\ n文件   “/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” ,   第420行,在_fork \ n可执行文件中,args,environment)\ n文件   “/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” ,   第466行,在_execChild \ n os.execvpe中(可执行文件,args,   环境)\ n文件   “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py”   第353行,在execvpe \ n _execvpe(file,args,env)\ n文件中   “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py”   第368行,在_execvpe \ n func(文件,* argrest)\ n \ n \ n错误:[Errno 2]否   这样的文件或目录\ n']

我没有看到任何明显的原因,为什么代码应该用[Errno 2]文件没有这样的文件或目录\ n']错误..

蒂亚

1 个答案:

答案 0 :(得分:5)

您要运行的程序是“尾部”。你想传递几个参数:“ - n”,“100”和“/var/log/system.log”。

相反,你的代码所做的是运行程序“tail -n 100 /var/log/system.log”,这可能在你的系统中不存在(我不希望这样)。

正确使用getProcessOutput是将程序与参数列表分开传递:

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