Python Can';t pickle<;类型';cStringIO.StringO'>;:使用多线程模块时,属性查找cStringIO.StringO失败错误
因此,在打印了Python Can';t pickle<;类型';cStringIO.StringO'>;:使用多线程模块时,属性查找cStringIO.StringO失败错误,python,python-2.7,Python,Python 2.7,因此,在打印了主机名和stdout.read()之后,我会得到如下错误 def execute_on_host((hostname, command), username=config['username'], keyfile=config['keyfile']): print hostname ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAd
主机名和stdout.read()
之后,我会得到如下错误
def execute_on_host((hostname, command), username=config['username'], keyfile=config['keyfile']):
print hostname
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=hostname, username=username, key_filename=keyfile)
stdin, stdout, stderr = ssh_client.exec_command(command)
print stdout.read()
ssh_client.close()
return stdout
我不知道如何解决这个问题
from multiprocessing import Pool
pool = Pool(len(host_cmds_list))
pool.map(execute_on_host, host_cmds_list)
pool.close()
pool.join()
您的stdout
是一个cStringIO
对象,它不能被pickle。尝试返回它的内容,而不是对象本身。您的stdout
是一个cStringIO
对象,不能被pickle。尝试返回它的内容而不是对象本身。主机cmds列表的内容是什么?它应该只包含可拾取的对象,即您应该能够无错误地运行cPickle.dumps(host\u cmds\u list)
。此函数是在哪里定义的?顺便说一句,变量的值是[('hostname1','/bin/date'),('hostname2','/bin/date')]
。另外,我不确定cpickle.dumps
是否正确,但是pickle.dumps
运行时没有任何错误。您的stdout
是无法pickle的cStringIO对象。尝试返回它的内容,而不是对象本身。@Wessie就是它。谢谢你可以加上这个作为答案,这样我就可以接受了。cPickle
(注意大写字母“p”)就是pickle的更快的C实现。传递给多处理函数和从多处理函数传递来的所有值都必须是可拾取的。host\u cmds\u list
的内容是什么?它应该只包含可拾取的对象,即您应该能够无错误地运行cPickle.dumps(host\u cmds\u list)
。此函数是在哪里定义的?顺便说一句,变量的值是[('hostname1','/bin/date'),('hostname2','/bin/date')]
。另外,我不确定cpickle.dumps
是否正确,但是pickle.dumps
运行时没有任何错误。您的stdout
是无法pickle的cStringIO对象。尝试返回它的内容,而不是对象本身。@Wessie就是它。谢谢你可以加上这个作为答案,这样我就可以接受了。cPickle
(注意大写字母“p”)就是pickle的更快的C实现。传递给多处理函数和传递自多处理函数的所有值都必须是可拾取的。
from multiprocessing import Pool
pool = Pool(len(host_cmds_list))
pool.map(execute_on_host, host_cmds_list)
pool.close()
pool.join()
print host_cmds_list
[('hostname1', '/bin/date'), ('hostname2', '/bin/date')]