我正在学习使用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']错误..
蒂亚
答案 0 :(得分:5)
您要运行的程序是“尾部”。你想传递几个参数:“ - n”,“100”和“/var/log/system.log”。
相反,你的代码所做的是运行程序“tail -n 100 /var/log/system.log”,这可能在你的系统中不存在(我不希望这样)。
正确使用getProcessOutput
是将程序与参数列表分开传递:
getProcessOutput("tail", ["-n", "100", "/var/log/system.log"])