multiprocess (and paramiko)
mennis
michaelian.ennis at gmail.com
Tue Jun 3 11:43:10 EDT 2014
I was able to work around this by using a completely different design but I still don''t understand why this doesn't work. It appears that the process that launches the process doesn't get access to updated object attributes. When I set and check them in the object itself it behaves as expected. When I check them from outside the object instance I get the initial values only. Could someone explain what I'm missing?
Here I have a simple multiprocessing class that when initializes takes a connected SSHClient instance and a command to run on the associated host in a new channel.
import multiprocessing
from time import time
from Crypto import Random
import paramiko
class Nonblock(multiprocessing.Process):
def __init__(self, connection, cmd):
Random.atfork()
multiprocessing.Process.__init__(self)
self.transport = connection.get_transport()
if self.transport is None:
raise ConnectionError("connection.get_transport() returned None ")
self.channel = self.transport.open_session()
self.command = cmd
self.done = False
self.stdin = None
self.stdout = None
self.stderr = None
self.status = None
self.message = str()
self.time = float()
def _read(self, channelobj):
"""read until EOF"""
buf = channelobj.readline()
output = str(buf)
while buf:
buf = channelobj.readline()
output += buf
return output
def run(self):
start = time()
stdin, stdout, stderr = self.channel.exec_command(command=self.command)
self.stderr = self._read(stderr)
self.status = stdout.channel.recv_exit_status()
if self.status != 0:
self.status = False
self.message = self.stderr
else:
self.status = True
self.message = self._read(stdout)
self.time = time() - start
stdin.close()
self.done = True
I expect to use it in the following manner:
from simplelib import Nonblock
from time import sleep
from paramiko import SSHClient, AutoAddPolicy
if __name__== "__main__":
connection = SSHClient()
connection.set_missing_host_key_policy(AutoAddPolicy())
username = "uname"
hostname = "hostname"
password = "password"
connection.connect(hostname, 22, username, password)
print connection.exec_command("sleep 1; echo test 0")[1].read()
n = Nonblock(connection,"sleep 20; echo test 2")
n.start()
print connection.exec_command("sleep 1; echo test 1")[1].read()
while not n.done:
sleep(1)
print n.message
print "done"
More information about the Python-list
mailing list