【问题标题】:Python, run terminal, and execute command in itPython,运行终端,并在其中执行命令
【发布时间】:2017-01-21 16:09:50
【问题描述】:

我使用的是 Python 2.7.5,因为这个版本安装在我要运行脚本的机器上。

我在 Tkinter 中创建了一个简单的 GUI,带有按钮和文本输入。 现在在一个输入中,我提供了服务器的 ip 或主机名,在下一步中,我读取输入字段的值并将其发送到 linux bash 终端,这里有一个问题。

从输入字段读取值(效果很好)

nazwa_ip = self.Input_IP_hostname.get("1.0", 'end-1c')

接下来:

os.system('gnome-terminal --window-with-profile=MY_PROFILE -e "ssh -t user_name@nazwa_ip"')

这就是问题所在,因为它不会将“nazwa_ip”更改为读取值。该命令发送到终端:

ssh -t user_name@nazwa_ip

但我想发送:

ssh -t user_name@ip_adres_from_input_field

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 感谢你的努力,但你为什么在这里添加bash标签,它看起来并没有多大关系。
  • 使用子进程模块执行命令怎么样?

标签: python linux os.system


【解决方案1】:

根据 Python 文档,建议将 os.system 替换为 subprocess 模块。

status = os.system("mycmd" + " myarg")
# becomes
status = subprocess.call("mycmd" + " myarg", shell=True)

【讨论】:

    【解决方案2】:

    字符串格式可以在这里使用:

    os.system('gnome-terminal --window-with-profile=MY_PROFILE -e "ssh -t user_name@%s"' % nazwa_ip)
    

    【讨论】:

    • 这是一个字符串comprehension吗?对我来说看起来像字符串 formatting
    【解决方案3】:

    使用 subprocess 方法可能会更好。

    import subprocess
    
    nazwa_ip = self.Input_IP_hostname.get("1.0", 'end-1c')
    ssh_param = "ssh -t user_name@{}".format(nazwa_ip)
    subprocess.call(['gnome-terminal', '--window-with-profile=MY_PROFILE', '-e',  ssh_param])
    

    【讨论】:

      【解决方案4】:

      虽然运行子进程很容易,但在图形终端中启动一个行为与用户启动的进程完全相同的子进程就有点麻烦了。您可以使用我的程序interminal (link),它基本上可以完成 Stephen Rauch 的回答对gnome-terminal 所做的事情,但是通过 shell 以便用户环境变量和别名等都可用,这可能在偶然情况下很有用它们会影响ssh 的运行方式。

      你可以像这样在 Python 中使用它:

      import subprocess
      subprocess.Popen(['interminal', 'ssh', '-t', 'username@{}'.format(ip_address)])
      

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 2019-10-21
        • 2011-04-13
        • 1970-01-01
        • 2020-09-25
        • 2018-01-11
        • 2020-03-02
        • 2016-02-13
        • 1970-01-01
        相关资源
        最近更新 更多