【问题标题】:Python Return Invalid Syntax ErrorPython 返回无效的语法错误
【发布时间】:2015-05-24 23:42:27
【问题描述】:

我正在树莓派上编写一个简单的 python 程序,我对 python 编程很陌生。我已经定义了一个名为 GetMessage 的函数,它没有参数并返回一个我称之为数据的变量,但我收到一个错误,指出

文件“Raspberry_pi.py”,第 39 行

不返回

    ^

SyntaxError: 无效语法

import os
import glob
import time
import RPi.GPIO as GPIO
from math import *
from bluetooth import *
from RPIO import PWM

os.system('sudo hciconfig hci0 pisca')
os.system('sudo hciconfig hci0 name "De Quadcoptur"')
servo = PWM.Servo()
StartSpin()

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

GetMessage()
DecodeInput()

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
def GetMessage():
    advertise_service( server_sock, "XT1032", #phone bluetooth name
        service_id = uuid,
        service_classes = [ uuid, SERIAL_PORT_CLASS ],
        profiles = [ SERIAL_PORT_PROFILE ],
        #protocols = [ OBEX_UUID ]
        )
    client_sock, client_info = server_sock.accept()

    try:
            data = client_sock.recv(1024)
            if len(data) == 0: break
            print "received [%s]" % data
            client_sock.close()
            server_sock.close()
    except IOError:
        pass

        break
    return data


def StartSpin():
    # Set servo on GPIO17 to 1200µs (1.2ms)
    servo.set_servo(17, 1000)
    servo.set_servo(18, 1000)
    servo.set_servo(19, 1000)
    servo.set_servo(20, 1000)
    time.sleep(1)
    servo.stop_servo(17)
    servo.stop_servo(18)
    servo.stop_servo(19)
    servo.stop_servo(20)
    #Check if more pulses is faster
    time.sleep(2000)
    PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
    PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
    PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
    PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
    PWM.add_channel_pulse(0, 17, start = 1000, width = 100)
    servo.stop_servo(17)
    servo.stop_servo(18)
    servo.stop_servo(19)
    servo.stop_servo(20)
    return None

def DecodeInput():
    data = GetMessage()
    if(data == 'start')
        StartSpin()
        return 0
    else if(data[0] == 'U')
        data.strip('U')
        UpPower = int(data)
        SetUpPower(UpPower)
    else if(data[0] == 'P')
        data.strip('P')
        PitchPower = int(data)
        SetPitchPower
    else
        data.strip('P')
        RollPower = int(data)
    SetPower(UpPower, PitchPower, RollPower)
    return None

def SetPower(UpPower, PitchPower, RollPower):
    #Make Arbitrary Values
    Motor1Power = UpPower #Front Left
    Motor2Power = UpPower #Front Right
    Motor3Power = UpPower #Back  Left
    Motor4Power = UpPower #Back  Right
    PitchPower = PitchPower /2
    RollPower = RollPower /2
    if(PitchPower < 25)
        Motor1Power = Motor1Power + abs(25-PitchPower)
        Motor2Power = Motor1Power + abs(25-PitchPower)
    else
        Motor3Power = Motor3Power + (PitchPower-25)
        Motor4Power = Motor4Power + (PitchPower-25)
    if(RollPower < 25)
        Motor1Power = Motor1Power + abs(25-RollPower)
        Motor3Power = Motor3Power + abs(25-RollPower)
    else
        Motor2Power = Motor2Power + (RollPower - 25)
        Motor4Power = Motor4Power + (RollPower - 25)

是什么导致了这个错误,我该如何解决?

编辑:我已将数据定义为全局变量,现在的错误是

文件“Raspberry_pi.py”,第 39 行

返回数据

    ^

SyntaxError: 无效语法

【问题讨论】:

  • 发布整个文件。第 39 行在哪里?
  • 修复缩进
  • 第 39 行是“返回数据”
  • @Root0x 您的错误消息另有说明。请按照 Michael 的建议发布整个文件,不要修改并修复缩进。
  • 如果我修复了代码的缩进,由于if 语句末尾缺少冒号,我会在不同的位置收到语法错误。您还会从else if 行(应该是elif 并且在行尾有一个冒号)和else(只需要一个冒号)中得到错误。 SetPitchPower 本身可能不会导致异常,但可能不会做你想做的事。

标签: python python-3.x raspberry-pi


【解决方案1】:

您的代码中存在许多语法问题。由于SyntaxError 异常的性质(当解释器不理解代码语法时引发),错误消息可能无法将正确的行标识为问题的根源。

我看到的第一个语法错误是您在 GetMessage 函数中使用了 break 而它没有处于循环中。 break 语句仅在 forwhile 块中有用,在其他地方使用(在本例中为 except 块)是语法错误。

下一组错误与缺少冒号有关。 DecodeInputSetPower中的每个条件分支都需要在条件后面加一个冒号:if condition1:elif condition2:else:

使用else if 而不是elif 也是错误的(如果您在else: 之后添加冒号、换行符和额外的缩进级别,然后使用单独的if 语句,则可以使其工作,但那样会浪费空间)。

还有一些其他问题,但它们不是语法错误。例如,您在定义函数之前从顶级代码调用函数,而DecodeInput 有一行带有裸表达式 SetPower 的行,它没有做任何有用的事情(您可能想调用 @987654339 @ 带有一些参数)。

希望这会让你走上正轨。

【讨论】:

    【解决方案2】:

    一旦你修正了你的冒号,你可能会遇到GetMessage 语法的问题。除非您在循环中,否则您不能break。如果您打算从异常中返回,则不需要 pass 调用。一个示例(从您的代码中简化)说明此方法(应该?)看起来如何:

    def GetMessage():
        data = None
    
        try:
            data = [1,2]
            if len(data) == 0: 
                return None
        except IOError:
            return None
    
        return data
    

    显然,您需要用您自己的代码替换该方法的大部分内容,并确定您是否真的想在您放置breaks 的位置从函数中使用return

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2016-08-07
      • 2016-10-18
      相关资源
      最近更新 更多