簡體   English   中英

Python,運行終端,並在其中執行命令

[英]Python, run terminal, and execute command in it

我正在使用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

有人可以幫我解決問題嗎?

根據Python文檔,建議將os.system替換為subprocess模塊​​。

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

字符串格式將在這里工作:

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

使用子過程方法可能會更好。

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])

雖然運行子過程很容易,但是在圖形終端中啟動行為與用戶啟動的子過程完全相同的子過程有些麻煩。 您可以使用我的程序interminallink ),該程序基本上可以完成Stephen Rauch的答案與gnome-terminal ,但是可以通過外殼程序使用戶環境變量和別名等全部可用,這可能會影響它們如何影響用戶的行為。 ssh運行。

您可以像這樣從Python使用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM