Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python/paramiko中保留对通道的引用_Python_Paramiko - Fatal编程技术网

在python/paramiko中保留对通道的引用

在python/paramiko中保留对通道的引用,python,paramiko,Python,Paramiko,Python中的奇怪行为¶miko 1.7.7.1 我有一个函数和一个类,它们实际上具有完全相同的代码,但该类将其分为两个方法。paramiko库的行为不同 函数:打开ssh连接,运行命令,等待完成并获取退出值 类:在setup()中打开ssh连接,运行命令,在finish()中等待完成并获取退出值 我注意到,如果我在setup()中读取标准输出,它就会工作(注释掉) 我对两件事感兴趣 如何在将频道存储为成员时使类工作,以及 在改变行为的作业等方面,到底有什么不同之处 输出: [func

Python中的奇怪行为&
paramiko 1.7.7.1

我有一个函数和一个类,它们实际上具有完全相同的代码,但该类将其分为两个方法。
paramiko
库的行为不同

函数:打开ssh连接,运行命令,等待完成并获取退出值

类:在
setup()
中打开ssh连接,运行命令,在
finish()
中等待完成并获取退出值

我注意到,如果我在
setup()
中读取标准输出,它就会工作(注释掉)

我对两件事感兴趣

  • 如何在将频道存储为成员时使类工作,以及

  • 在改变行为的作业等方面,到底有什么不同之处

  • 输出:

    [function]
    exitVal: 0
    stdout: hello
    
    [class]
    exitVal: -1
    stdout: 
    
    代码:

    MY_SERVER
    是一个基于密钥登录的主机名(无需密码)

    from paramiko import SSHClient
    
    SSH_SERVER = "MY_SERVER"
    SSH_CMD = "echo 'hello'"
    
    def working_function():
    
        client = SSHClient()
        client.load_system_host_keys()
    
        # connect with current user credentials
        client.connect(SSH_SERVER)
    
        sshChannel = client.get_transport().open_session()
    
        sshChannel.exec_command(SSH_CMD)
        stdout = sshChannel.makefile('rb')
        exitVal = sshChannel.recv_exit_status()
    
        print "exitVal: {0}\nstdout: {1}\n".format(exitVal, stdout.read())
    
    class NotWorkingClass:
    
        def setup(self):
    
            client = SSHClient()
            client.load_system_host_keys()
    
            # connect with current user credentials
            client.connect(SSH_SERVER)
    
            self.sshChannel = client.get_transport().open_session()
            self.sshChannel.exec_command(SSH_CMD)
    
            self.stdout = self.sshChannel.makefile('rb')
    
            # works
            # self.stdout.read()
    
        def finish(self):
    
            exitVal = self.sshChannel.recv_exit_status()
            print "exitVal: {0}\nstdout: {1}\n".format(exitVal, self.stdout.read())
    
    working_function()
    
    c = NotWorkingClass()
    c.setup()
    c.finish()