我需要帮助修改一个特定需求的Python脚本

1 投票
4 回答
612 浏览
提问于 2025-04-16 22:21

我对Python完全是个新手,平时用的是Perl。

我有一个Arduino,接了一些伺服电机,用来控制一个网络摄像头,相关的脚本运行得很好,伺服电机能接收到指令并按预期工作:

    #!/usr/bin/env python
    import serial

    usbport = '/dev/ttyACM0'

    # Set up serial baud rate
    ser = serial.Serial(usbport, 9600, timeout=1)


    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

        Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
         the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
       ser.write(chr(255))
       ser.write(chr(servo))
       ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180.\n"

简单来说,上面这个脚本的命令是:

    python
    import servo
    servo.move(1, 180)

我已经把这个脚本改成可以接受命令行输入,但程序似乎不太好使。有没有人能帮我找出我哪里出错了?这是我的版本:

    #!/usr/bin/env python
    import serial
    import sys

    try:
            servo = int(sys.argv[1])
            angle = int(sys.argv[2])
    except IndexError:
            print ('a servo and angle are required')
    sys.exit(2)

    # Set up serial baud rate
    usbport = '/dev/ttyACM0'
    ser = serial.Serial(usbport, 9600, timeout=1)

    def move(servo, angle):
        '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle
    move(servo, angle)

简单来说,上面这个脚本的命令是:

    servo.py 1 180

我知道这个脚本应该能正常工作,因为如果我让它执行1 181的指令,它会报错说角度超出范围,所以我真的搞不懂为什么信息没有传递到串口/Arduino。

非常感谢任何帮助,抱歉发了这么长的帖子。

吉尔伯特

4 个回答

1

看起来你在函数定义后的缩进有问题。应该是这样的:

def move(servo, angle):
    '''Moves the specified servo to the supplied angle.

    Arguments:
        servo
          the servo number to command, an integer from 1-4
        angle
          the desired servo angle, an integer from 0 to 180

    (e.g.) >>> servo.move(2, 90)
           ... # "move servo #2 to 90 degrees"'''

    if (0 <= angle <= 180):
        ser.write(chr(255))
        ser.write(chr(servo))
        ser.write(chr(angle))
    else:
        print "Servo angle must be an integer between 0 and 180. You typed:"
        print servo
        print angle

(注意一下if...else块的缩进方式)

2

除了@combatdave的回答,关于这一部分:

try:
        servo = int(sys.argv[1])
        angle = int(sys.argv[2])
except IndexError:
        print ('a servo and angle are required')
sys.exit(2)

# Set up serial baud rate

你也应该把sys.exit(2)缩进一下。因为这样的话,程序在获取参数后就会立刻退出。

0

为什么要修改原来的脚本呢?直接用这个就行了:

import servo
servo.move(int(argv[1]), int(argv[2]))

我不太确定这个问题是不是在把代码粘贴到stackoverflow时出现的,但有好几个地方的缩进是有问题的。请你也检查一下这个 :)

撰写回答