2016-04-21 48 views
1

這是我第一篇文章,因此請讓我知道,如果我不遵循正確的禮儀。Python運行Shell無需輸入

我也是Python新手,想將它合併到一個項目中。我目前有一個Emotiv腦電圖耳機,並希望從大腦信號中運行一個自制的3D打印機。爲此,通過EmoKey 2.0.0.20(參見附圖)讀取腦電圖耳機,然後EmoKey將鍵擊發送到Python Shell,Python解釋此操作,並通過COM端口將命令發送到我的Arduino運行打印機。 這看起來可能是一種間接的做事方式,但它的工作除了一個順利。讓我們假裝我認爲離開了,這被髮送到EmoKey類型'L'和鍵入Enter到Python Shell中。理論上這會使打印頭向左移動。但是,當EmoKey發送Enter時,它只會在Shell中創建一個新行,但它不會實際執行。然後,我必須手動按下輸入鍵,這會破壞整個點。

.getch()沒有工作,因爲我不認爲它有一個實際的鍵盤筆畫供它閱讀。下面的鏈接似乎也是有用的,但迄今爲止它還沒有奏效。

How to run a shell script without having to press enter/confirm s.th. inbetween

我的問題是:我怎樣才能讓Python執行什麼寫在shell時只喜歡L或R寫入的東西?我不認爲我可以等待擊鍵,Python必須等待並在看到特定命令時自動執行。

我知道這可能看起來像是下面鏈接的副本。不過,.getch到目前爲止還沒有與EmoKey合作(也許這只是我的錯誤)。另外,我不想找到一種方法讓我的Python腳本讀取放入shell的內容。雖然我爲了簡單和原型開始只使用「L」和「R」命令啓動了這個項目,但我會轉而使用G代碼,以便與其他打印機或CNC設備進行通信。這就是爲什麼.getch不能在我的情況下工作的另一個原因,因爲它只抓取一個字符(一個G代碼命令只有幾個字符)。 Python read a single character from the user

我使用的是Windows 10和Python 2.7.11。

import serial 

ser = 0 

def init_serial(): 
    COMNUM = 3   #Enter Your COM Port Number Here. 
    global ser   #Must be declared in Each Function 
    ser = serial.Serial() 
    ser.baudrate = 9600 
    ser.port = COMNUM - 1 #COM Port Name Start from 0 

    #ser.port = '/dev/ttyUSB0' 

    #Specify the TimeOut in seconds, so that SerialPort 
    #Doesn't hangs 
    ser.timeout = 10 
    ser.open()   #Opens SerialPort 

    # print port open or closed 
    if ser.isOpen(): 
     print 'Open:' + ser.portstr 

init_serial() 

while 1: 
    temp = raw_input('Send command + Enter:\r\n') 
    ser.write(temp)   #Writes to the SerialPort 

    #bytes = ser.readline() #Read from Serial Port 
    #print 'Response: ' + bytes  #Print What is Read from Port 

EmoKey Interface

+0

感謝您將此引起我的注意,我改變了我的問題,以表示我的想法與衆不同。讓我知道是否需要更多的澄清。 – cabenso

回答

1

我認爲你正在尋找的東西像readchar

import readchar 
ch = readchar.readkey() 
0

這個定義是怎麼樣的笨重和不令人滿意的,但我認爲它可以解決你的問題,而無需安裝任何新的軟件包。如果我創建了一個模塊defined in this link(我把它放在名爲「getch.py​​」的文件中),我們可以檢查輸入密鑰是否與字符串列表中的任何內容匹配。

from getch import getch 

while True: 
    if getch() in ['l', 'r', 'L', 'R']: 
     print('This was the key I was looking for!') 

從技術上講,你只需要我掛,是有關您的操作系統之類的部分,但我掛之處在於它是跨平臺的很好的這個例子getch()功能。

+0

感謝您的輸入。也許我只是沒有得到它。我輸入了Daniel Prince的確切代碼,但將(從getch import getch)更改爲(從msvcrt import getch)。每當我運行它時,什麼都不會發生。如果我認爲「L」或「l」,它沒有通過if語句。 理論上,我應該可以在shell中寫一個「L」,然後它會轉到「這是我正在尋找的關鍵!」,對吧? – cabenso

+0

真的嗎?在我的Windows 8.1安裝中,我可以像上面提到的那樣,將我鏈接到的'getch'模塊切換爲'from msvcrt import getch',這個代碼片段仍然適用於我。 –