【问题标题】:Python Run Shell Without Enter [duplicate]Python在不输入的情况下运行Shell [重复]
【发布时间】:2016-08-14 01:19:48
【问题描述】:

这是我第一次在 stackoverflow 上发帖,如果我没有遵守正确的礼仪,请告诉我。

我也是 Python 新手,想将它整合到一个项目中。我目前有一个 Emotiv EEG 耳机,并想根据大脑信号运行一台自制的 3-D 打印机。为此,EmoKey 2.0.0.20 读取 EEG 耳机(见附图),然后 EmoKey 将击键发送到 Python Shell,Python 对此进行解释并通过 COM PORT 向我的 Arduino 运行打印机发送命令。 这似乎是一种间接的做事方式,但除了一个障碍外,它确实有效。让我们假装我认为左边,这被发送到 EmoKey 类型“L”和击键进入 Python Shell。从理论上讲,这会将打印头向左移动。但是,当 EmoKey 发送 Enter 时,它只会在 Shell 中创建一个新行,它实际上并没有执行。然后我必须用手按回车键,这会破坏整个观点。

.getch() 没有工作,因为我认为没有实际的击键可以读取。下面的链接似乎也很有用,但到目前为止还没有工作。

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

我的问题是:当只编写 L 或 R 之类的内容时,如何让 Python 执行 shell 中编写的内容?我认为我不能让它等待击键,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

【问题讨论】:

  • 感谢您让我注意到这一点,我已经更改了我的问题以表示我认为它有何不同。如果需要更多说明,请告诉我。

标签: python shell


【解决方案1】:

我认为您正在寻找类似readchar:

import readchar
ch = readchar.readkey()

【讨论】:

    【解决方案2】:

    这个定义有点笨拙且令人不满意,但我认为它无需安装任何新软件包即可解决您的问题。如果我创建一个模块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() 函数很好,因为它是跨平台的。

    【讨论】:

    • 感谢您的意见。也许我只是不明白。我输入了 Daniel Prince 的确切代码,但将 (from getch import getch) 更改为 (from msvcrt import getch)。每当我运行它时,什么都没有发生。如果我按下“L”或“l”,它不会通过 if 语句。理论上,我应该可以在 shell 中只写一个“L”,然后它会转到“这是我要找的密钥!”,对吧?
    • 真的吗?在我的 Windows 8.1 安装中,我能够切换出我为 from msvcrt import getch 链接的 getch 模块,正如你提到的,这段代码 sn-p 对我来说仍然可以正常工作。
    猜你喜欢
    • 2014-05-03
    • 2011-06-26
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2018-11-20
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多