2017-08-09 72 views
0

我有一個非常簡單的問題,但似乎無法在任何地方獲得簡單的解決方案。 我有一個應用程序在我的Pi上運行,我通過鍵入終端並傳遞一些參數開始。例如:Pi 3上的Python打開並控制一個控制檯應用程序

sudo $HOME/Projects/myExampleApp MD_DWNC2378 

這會導致控制檯應用程序啓動並且如預期的那樣可以接受鍵盤輸入。

現在,我想要做的是重複迄今從python應用程序描述的過程。我的python應用程序應該能夠在終端中打開myExampleApp,獲取對控制檯窗口的引用,然後將來自我的Python應用程序的任何命令作爲鍵盤按鈕輸入到myExampleApp。

在Windows平臺上,pywinauto庫可以完成這項工作。

什麼是我在我的Pi 3上運行的Linux上描述的最佳選擇?

任何建議將是非常有益的。

+0

看看python的'subprocess'模塊。 – cdarke

+0

pywinauto是GUI應用程序,爲什麼使用它的控制檯? +1子進程。 –

回答

0

看看https://docs.python.org/2/library/cmd.html接收命令。您的應用程序可以按照其他用戶建議的子流程運行:

import cmd 
import sys 
import subprocess 
class Controller(cmd.Cmd): 
    cmd = 'while true; do cat /dev/stdin;sleep 1;done' 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 

    def default(self, cmd): 
     self.p.stdin.write(cmd+"\n") 
     a=self.p.stdout.readline() 
     sys.stdout.write("subprocess returned {}".format(a)) 
     sys.stdout.flush() 

if __name__ == '__main__': 
    try: 
     Controller().cmdloop() 
    except: 
     print('Exit') 

運行此腳本將爲您提供一個CLI界面。任何發送的命令都將被轉發到您的應用程序的標準輸入(由所示的shell腳本進行模擬)。

如果您不需要處理返回的stdout,則可以跳過self.p.stdout.readline()調用。如果您需要返回的數據,將readline()調用更改爲read()可能會有所幫助,這會讀取直到應用程序發送EOF。

應用程序的sudo需求可能可以通過使用sudo運行python腳本來克服。我不是安全專家,但要注意將腳本作爲sudo運行的安全風險以及Popen調用的shell = True參數。

相關問題