#!/usr/bin/env python
# -*- coding: utf-8 -*-
from threading import Thread
from time import sleep
class async(Thread):
def __init__(self, callback, errback):
super(async, self).__init__()
self.callback = callback
self.errback = errback
def __call__(self, func):
# à l'appel de la fonction, on récupère juste la fonction
# et ses arguments, et on lance notre thread
def wrapper(*args, **kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
self.start()
return wrapper
def run(self):
try:
retval = self.func(*self.args, **self.kwargs)
self.callback(retval)
except Exception as err:
self.errback(err)
def my_callback(retval):
print "CALLBACK:", retval
# ici on peut faire des opérations supplémentaires
# sur la valeur renvoyée par la fonction.
# ce code est appelé par le thread, il ne peut donc
# pas bloquer notre thread principal
def my_errback(err):
print "ERRBACK", err
# ici on peut re-lancer l'exception, ou simplement
# l'ignorer. Ce code est également appelé dans le thread
@async(my_callback, my_errback)
def ma_fonction_reussie(n):
sleep(n)
return n
@async(my_callback, my_errback)
def ma_fonction_foireuse(n):
sleep(n)
raise AttributeError("Got %s, expected 'foo'" % n)
ma_fonction_reussie(5)
ma_fonction_foireuse(7)
# histoire de passer le temps pendant ce temps là...
for i in range(10):
print "MAIN:", i
sleep(1)
Wednesday, October 14, 2015
Turn a function in asynchrounous mode
https://pykodz.wordpress.com/2010/11/15/async-decorator/
Remote command with Paramiko-Expect
https://www.snip2code.com/Snippet/430662/Python-3-x-SSH-with-Paramiko---Paramiko-
#!/usr/bin/env python
# PyNet Class Exercises by Nick Ellson
__author__ = "Nick Ellson"
import paramiko
from paramikoe import SSHClientInteraction
import getpass
# Collect an target, user, and password. This example assumes that privilege level 15 is on your Cisco VTY.
ip = input("Enter Host: ")
username = input("Enter Username: ")
password = getpass.getpass()
#Initialize teh Paramiko connection
remote_conn_pre = paramiko.SSHClient()
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote_conn_pre.connect(ip, username=username, password=password, allow_agent=False, look_for_keys=False)
print ("SSH connection established to %s" % ip)
# Here we make a simple Paramiko only shell because we do not yet have a prompt example to work with for Expect.
# So this will basically log us in, and grab that prompt that we land with, and disconnect.
remote_conn = remote_conn_pre.invoke_shell()
output = remote_conn.recv(1000).decode("utf-8")
prompt = output.strip()
remote_conn.close()
# Now we reconnect with the paramiko expect module and we have a nice interactive conversation.
remote_conn_pre.connect(ip, username=username, password=password, allow_agent=False, look_for_keys=False)
interact = SSHClientInteraction(remote_conn_pre, timeout=20, display=False)
#Logged in, wait for the prompt to display.
interact.expect(prompt)
#Shut off the --more-- prompting
interact.send('terminal length 0')
interact.expect(prompt)
#We don't care about the output for that last command, so just clear the buffer.
cmd_output = interact.current_output_clean
#Let's grab something BIG that use dto be a real timing issue the old way, not knowing how long it might take to get a full
# running config over a WAN link. Now we do not care, we will simply wait to the prompt shows up.
interact.send('show running-config')
interact.expect(prompt)
cmd_output = interact.current_output_clean
print (cmd_output)
#Close our session
remote_conn_pre.close()
Monday, October 12, 2015
Spnner - AsyncIO example-
Nice example using asyncio in Python3.5
# spinner_await.py
# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html
# BEGIN SPINNER_AWAIT
import asyncio
import itertools
import sys
async def spin(msg): # <1>
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x08' * len(status))
try:
await asyncio.sleep(.1) # <3>
except asyncio.CancelledError: # <4>
break
write(' ' * len(status) + '\x08' * len(status))
async def slow_function(): # <5>
# pretend waiting a long time for I/O
#await asyncio.sleep(3) # <6>
for i in range(100000000):
i += 1
await asyncio.sleep(.0000001)
return 42
async def supervisor(): # <7>
spinner = asyncio.ensure_future(spin('thinking!')) # <8>
print('spinner object:', spinner) # <9>
result = await slow_function() # <10>
spinner.cancel() # <11>
return result
def main():
loop = asyncio.get_event_loop() # <12>
result = loop.run_until_complete(supervisor()) # <13>
loop.close()
print('Answer:', result)
if __name__ == '__main__':
Subscribe to:
Comments (Atom)