zc.monitor é um servidor que fornece uma interface de linha de comando para solicitar vários bits de informação. & Nbsp; O servidor é zc.ngi base, para que possamos utilizar a infra-estrutura de testes zc.ngi para demonstrá-lo.
& Nbsp; >>> zc.ngi.testing importação
& Nbsp; >>> zc.monitor importação
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
O servidor suporta um conjunto extensível de comandos. Ele olha para cima comandos como nomeados zc.monitor.interfaces.IMonitorPlugin "utilities", como definido pelo pacote zope.component.
Para ver isso, vamos criar um plugin Olá:
& Nbsp; >>> def Olá (ligação, name = "mundo"):
& Nbsp; ... "" "Diga Olá
& Nbsp; ...
& Nbsp; ... Forneça um nome se você não é do mundo.
& Nbsp; ... "" "
& Nbsp; ... connection.write ("! Hi% s, prazer em conhecê-ya n" name%)
e registrá-lo:
& Nbsp; >>> zc.monitor.register (Olá)
Quando registar um comando, nós podemos fornecer um nome. Para ver isso, vamos registar Olá novamente:
& Nbsp; >>> zc.monitor.register (Olá, 'oi')
Agora podemos dar o comando Olá para o servidor:
& Nbsp; >>> connection.test_input ('oi n')
& Nbsp; Hi mundo, legal te conhecer!
& Nbsp; -> Fechar
Podemos passar um nome:
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('Olá Jim n')
& Nbsp; Hi Jim, legal te conhecer!
& Nbsp; -> Fechar
O servidor vem com alguns comandos básicos. Vamos registrá-los para que possamos ver o que eles fazem. Vamos usar a interface de registro simplfied:
& Nbsp; >>> zc.monitor.register_basics ()
O primeiro é o comando de ajuda. Dando ajuda sem entrada, dá uma lista de comandos disponíveis:
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('help n')
& nbsp; Compatível comandos:
& Nbsp; Olá - Say Olá
& Nbsp; help - Obtenha ajuda sobre comandos do servidor
& Nbsp; oi - Say Olá
& Nbsp; interativo - Ativar o modo interativo do monitor
& Nbsp; quit - Sair do monitor
& Nbsp; -> Fechar
Podemos obter ajuda detalhada, especificando um nome de comando:
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('help help n')
& Nbsp; Ajuda para ajuda:
& Nbsp;
& Nbsp; Obtenha ajuda sobre comandos do servidor
& Nbsp;
& Nbsp; Por padrão, uma lista de comandos e resumos é impresso. Fornecer
& Nbsp; um nome de comando para obter a documentação detalhada para um comando.
& Nbsp;
& Nbsp; -> Fechar
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('help Olá n')
& Nbsp; Ajuda para Olá:
& Nbsp;
& Nbsp; Diga Olá
& Nbsp;
& Nbsp; Forneça um nome se você não é do mundo.
& Nbsp;
& Nbsp; -> Fechar
O comando interativo muda o monitor em modo interativo. Como visto acima, o monitor normalmente responde a um único comando e, em seguida, fecha a conexão. Em "modo interativo", a conexão não está fechado até que o comando quit é usado. Isso pode ser útil ao acessar o monitor via telnet para diagnósticos.
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input (' n interativa ")
& Nbsp; O modo interativo on. Use "quit" para sair.
& Nbsp; >>> connection.test_input ('ajudar interativo n')
& Nbsp; Ajuda para interativo:
& Nbsp;
& Nbsp; Ativar o modo interativo do monitor
& Nbsp;
& Nbsp; Normalmente, o monitor libera a conexão depois de um único comando.
& Nbsp; Ao entrar no modo interativo, o monitor não terminar a ligação
& Nbsp; até que você digite o comando "quit".
& Nbsp;
& Nbsp; No modo interativo, uma linha vazia repete o último comando.
& Nbsp;
& Nbsp; >>> connection.test_input ('ajudar a parar n')
& Nbsp; Ajuda para parar:
& Nbsp;
& Nbsp; Feche o monitor
& Nbsp;
& Nbsp; Isso só é realmente útil no modo interativo (veja a "interativo"
& Nbsp; de comando).
& Nbsp;
Observe que o resultado dos comandos não terminou com "-> Fechar", o que teria indicado uma conexão fechada.
Note também que o modo interativo permite que você repita comandos.
& Nbsp; >>> connection.test_input ('Olá n')
& Nbsp; Hi mundo, legal te conhecer!
& Nbsp; >>> connection.test_input (' n')
& Nbsp; Hi mundo, legal te conhecer!
& Nbsp; >>> connection.test_input ('Olá Jim n')
& Nbsp; Hi Jim, legal te conhecer!
& Nbsp; >>> connection.test_input (' n')
& Nbsp; Hi Jim, legal te conhecer!
Agora vamos usar sair para fechar a conexão.
& Nbsp; >>> connection.test_input ('sair n')
& Nbsp; Adeus.
& Nbsp; -> Fechar
Por fim, vale a pena notar que as exceções irá gerar um rastreamento na conexão.
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('Olá Jim 42 n') # doctest: + ELLIPSIS
& Nbsp; Traceback (most recent call last):
& Nbsp; ...
& Nbsp; TypeError: Olá () leva, no máximo, dois argumentos (3 dado)
& Nbsp;
& Nbsp; -> Fechar
Loops de Comando
Usando o modo "mais", os comandos podem sinalizar que querem reivindicar todas as entradas do usuário futuro. Nós vamos implementar um exemplo bobo para demonstrar como funciona.
Aqui está um comando que implementa uma calculadora.
& Nbsp; '.' >>> Prompt =
& Nbsp; >>> def Calc (conexão, * args):
& Nbsp; ... se args e args [0] == 'sair':
& Nbsp; ... retornar zc.monitor.QUIT_MARKER
& Nbsp; ...
& Nbsp; ... se args:
& Nbsp; ... connection.write (. Str (eval ('' join (args))))
& Nbsp; ... connection.write (' n')
& Nbsp; ...
& Nbsp; ... connection.write (prompt)
& Nbsp; ... retornar zc.monitor.MORE_MARKER
Se eu registrar esse comando ...
& Nbsp; >>> zc.monitor.register (CALC)
... Podemos invocá-lo e ficamos com um prompt.
& Nbsp; >>> conexão = zc.ngi.testing.TextConnection ()
& Nbsp; >>> server = zc.monitor.Server (conexão)
& Nbsp; >>> connection.test_input ('calc n')
& Nbsp ;.
Se, então, dar-lhe mais entrada obtemos o resultado além de um outro pedido.
& Nbsp; >>> connection.test_input ('2 + 2 n')
& Nbsp; 4
& Nbsp ;.
& Nbsp; >>> connection.test_input ('4 * 2 n')
& Nbsp; 8
& Nbsp ;.
Uma vez que estamos a fazer, podemos dizer a calculadora para nos deixar ir.
& Nbsp; >>> connection.test_input ('sair n')
& Nbsp; -> Fechar
Comece servidor
& Nbsp; >>> tempo de importação
& Nbsp; >>> zope.testing.loggingsupport importação, extração de madeira
& Nbsp; >>> loghandler = zope.testing.loggingsupport.InstalledHandler (
& Nbsp; ... Nenhum, nível = logging.INFO)
& Nbsp; >>> zc.monitor.start (9644)
& Nbsp; ('', 9644)
& Nbsp; >>> print loghandler
& Nbsp; zc.ngi.async.server INFO
& Nbsp; escutando em ('', 9644)
& Nbsp; >>> zc.monitor.last_listener.close ()
& Nbsp; >>> zc.monitor.last_listener = None
& Nbsp; >>> time.sleep (0,1)
& Nbsp; >>> loghandler.clear ()
& Nbsp; >>> zc.monitor.start (('127.0.0.1', 9644))
& Nbsp; ('127.0.0.1', 9644)
& Nbsp; >>> print loghandler
& Nbsp; zc.ngi.async.server INFO
& Nbsp; escutando na ('127.0.0.1', 9644)
& Nbsp; >>> zc.monitor.last_listener.close ()
& Nbsp; >>> zc.monitor.last_listener = None
& Nbsp; >>> time.sleep (0,1)
Vincular à porta 0:
& Nbsp; >>> addr = zc.monitor.start (0)
& Nbsp; >>> addr == zc.monitor.last_listener.address
& Nbsp; A verdadeira
& Nbsp; >>> zc.monitor.last_listener.close ()
& Nbsp; >>> zc.monitor.last_listener = None
& Nbsp; >>> time.sleep (0,1)
Tentando religar a uma porta em uso:
& Nbsp; >>> loghandler.clear ()
& Nbsp; >>> zc.monitor.start (('127.0.0.1', 9644))
& Nbsp; ('127.0.0.1', 9644)
& Nbsp; >>> zc.monitor.start (('127.0.0.1', 9644))
& Nbsp; False
& Nbsp; >>> print loghandler
& Nbsp; zc.ngi.async.server INFO
& Nbsp; escutando na ('127.0.0.1', 9644)
& Nbsp; zc.ngi.async.server AVISO
& Nbsp; incapaz de escutar ('127.0.0.1', 9644)
& Nbsp; raiz AVISO
& Nbsp; incapaz de iniciar o servidor zc.monitor porque o endereço ('127.0.0.1', 9644) está em uso.
& Nbsp; >>> zc.monitor.last_listener.close ()
& Nbsp; >>> zc.monitor.last_listener = None
& Nbsp; >>> time.sleep (0,1)
& Nbsp; >>> loghandler.uninstall ()
O que é novo nesta versão:
- Ao ligar o monitor a um soquete do domínio Unix, remova um soquete existente no mesmo caminho, de modo a ligação é bem sucedida. Isso pode afetar o uso existente com relação a zopectl comportamento de depuração, mas vai ser mais previsível.
O que é novo na versão 0.3.0:
- Adicionado uma interface de registo simplificado .
Requisitos :
- Python
Comentários não encontrado