【问题标题】:Python Paramiko - Run commandPython Paramiko - 运行命令
【发布时间】:2012-03-17 06:06:26
【问题描述】:

我正在尝试运行这个脚本:

hostname = '192.168.3.4'
port = 22
username = 'username'
password = 'mypassword'
y = "2012"
m = "02"
d = "27"

if __name__ == "__main__":
   s = paramiko.SSHClient()
   s.load_system_host_keys()
   s.connect(hostname, port, username, password)
   command = 'ls /home/user/images/cappi/03000/y/m/d'
   s.close

问题是: 如何将变量 y,m,d 放入变量 command 中?

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    Python 有很多方法来执行字符串格式化。最简单的方法之一是将字符串的各个部分简单地连接在一起:

    #!/usr/bin/env python
    hostname = '192.168.3.4'    
    port = 22
    username = 'username'
    password = 'mypassword'
    y = "2012"
    m = "02"
    d = "27"
    
    def do_it():
        s = paramiko.SSHClient()
        s.load_system_host_keys()
        s.connect(hostname, port, username, password)
        command = 'ls /home/user/images/cappi/03000/' + y + '/' + m + '/' + d
        (stdin, stdout, stderr) = s.exec_command(command)
        for line in stdout.readlines():
            print line
        s.close()
    
    if __name__ == "main":
        do_it()
    

    【讨论】:

    • 我认为这并没有明显好转。现在,如果你说 '/'.join([y, m, d]) 你就有了案例。
    • 这里的问题不是语法,问题是如果你运行a1 + a2 + a3 + ... + an,你正在创建和销毁n-1临时字符串。 join 在 Python 中只创建 1 个字符串。这是一个坏习惯。
    • 我要指出 1. n 在这里非常小,2. + 运算符在这里非常可读,3. greaterdebater.com/blog/gabe/post/7
    • @matt:我认为我们将不得不同意在这里不同意。这是一个惯例,最好养成正确的习惯,IMO。
    • 这个答案通常是正确的。但是代码不可靠。在某些情况下它可能会死锁。详情请见Wait to finish command executed with Python Paramiko
    【解决方案2】:
    command = 'ls /home/user/images/cappi/03000/%s/%s/%s' %(y,m,d)
    

    【讨论】:

      【解决方案3】:

      使用new format specifications,您可以按名称访问参数:

      'ls /home/user/images/cappi/03000/{year}/{month}/{day}'.format(year=y, month=m, day=d)
      

      【讨论】:

      【解决方案4】:

      我更喜欢

      command = f"ls /home/user/images/cappi/03000/{y}/{m}/{d}"
      

      【讨论】: