0

我需要帮助来控制 python 脚本。我想运行一个控制两个机器人的脚本。例程由一系列运动组成,这些运动要么移动手臂,要么移动夹具。代码形式如下:

def robot_exec():
  # List of robot arm poses:
  *many_many_lines_of_position_vectors*

  # List of robot gripper poses:
  *open position*
  *close position*

  while 1:
    *Call a function that moves the robot arm(s) to a position on the list*
    *Call a function that moves the robot gripper(s) to a position on the list*
    *continue calling functions many times until the desired routine is complete*
    n = raw_input("Restart the routine? (Y/N)")
    if n.strip() == 'n' or 'N':
      break
    elif n.strip() == 'y' or 'Y':
      continue
    else:
      print "Invalid input. Exiting..."
      break

如果例程完成(即每个函数都被调用),它会询问我是否要重新启动,如果我选择是,则表现正常,这很好。

但是,如果我在例程中间按 ctrl-C,则会出现消息“重新启动例程?” 仍然弹出并要求输入,我不希望那样。我想要的是以下之一:

  1. 当且仅当用户按下 ctrl-C 时,完全退出一切,不问任何问题。
  2. 当且仅当用户按下 ctrl-C 时,将机器人返回到初始位置(在该手臂姿势列表中定义),然后完全退出一切。

我的主要问题是, ctrl-C 实际上是如何工作的?我以为它只会退出脚本,但实际上它仍然会打印内容并要求输入。这个广泛问题的一个子集是,我怎样才能获得所需的行为(按 ctrl-C 时完全退出所有内容)?

我意识到这是一种笨拙的方式来做我需要机器人做的事情,但这是我能想到的最好的方式,因为我对 python 的了解有限。

谢谢,

-阿德里安

4

3 回答 3

0

关于信号的评论/答案在技术上是正确的(在 UNIX 上),但在 Python 中,CTRL+C 处理巧妙地远离了您。在 Python 程序中发生的情况是,在您按下 CTRL+C 时,KeyboardInterrupt会引发异常。

现在,您的问题似乎出在您从清单中删除的代码中,即在“调用机器人例程”部分中。该代码捕获KeyboardInterrupt.

我猜您调用的代码或库代码执行以下操作:

try:
    # some long running code
    # ...
except:
    # something, or just pass

注意裸体except:。裸体except几乎总是一件坏事。相反,您或图书馆应该这样做:

try:
    # some long running code
    # ...
except Exception:
    # something to fix the situation

usingexcept Exception:不会捕获KeyboardInterrupt异常,这将使您可以适当地处理它,或者只是让程序退出。查看Exception 类层次结构

于 2014-08-22T12:11:25.293 回答
0

当用户按下 Ctrl-C 时究竟会发生什么?

发出一个信号。


我怎样才能得到想要的行为

>>> import signal
>>> def handler(sig, stack_frame):
...     print "Handled"
... 
>>> signal.signal(signal.SIGINT, handler)
<built-in function default_int_handler>
^C   # <--- typed ctrl-c here
>>> Handled

有关详细信息,请参阅信号文档。


请注意:在 Linux 上我使用signal.SIGINT. 在 Windows 上,也许是这样signal.CTRL_C_EVENT

于 2014-08-21T21:52:14.593 回答
0

您可以Ctrl_C使用以下代码处理:

#!/usr/bin/env python
import signal
import sys
def signal_handler(signal, frame):
        #write your command here for example i write print below :
        print('You pressed Ctrl+C!')
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')
signal.pause()
于 2014-08-21T21:58:40.363 回答