Команда, не определенная в Python - Реальные основы, но запутанные!

Я написал этот короткий скрипт (из которого я убрал некоторые незначительные детали для размера), и я получаю очень простую ошибку, но я не понимаю, почему! Я очень новичок в Python, поэтому, может быть, кто-нибудь может объяснить проблему и почему она не работает?

Ошибка, кажется, возникает, когда я хочу напечатать полную пользовательскую строку последовательной записи обратно в консоль, похоже, она не распознает аргументы, которые я отправил в функцию.

Возможно, я неправильно понял что-то очень простое. Должен быть простым для любого, даже с минимальным пониманием Python.

Ваше здоровье

Код:

#! /usr/bin/env python

# IMPORTS APPEAR HERE ***

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=115200,
    parity='N',
    stopbits=1,
    bytesize=8
)

# Sets motor number
motor_no = "2"

# Lets create our main GUI class
class ArialApp(object):
    # Default init stuff
    def __init__(self):
        # Create a builder object and create the objects from the .glade file
        self.builder = gtk.Builder()
        self.builder.add_from_file("../res/main.glade")
        self.builder.connect_signals(self)

        # Open the serial connection to the encoder and keep it open
        ser.open()

        # Custom function for sending commands down the serial. Needed to wrap defaults
        # arround the custom 'serial.write' command.
        self.send_command('A')

        # Code removed for space..... 

    # Custom method for sending commands down serial with default ammendments
    def send_command(self, nanotech):
        # Send the command with the #, then motor number which should be global, then the command
        # sent the the method followed by a return
        ser.write("#" + motor_no + nanotech + '\r\n')

        # Print to the console the full command sent down the pipe
        # [[[ ERROR GOES HERE ]]]
        print "#" + motor_no + nanotech + '\r\n'

# Just to show its in here...
if __name__ == "__main__":
    app = ArialApp()
    gtk.main()

Ошибка:

File "main.py", line 62, in ArialApp
    print "#" + motor_no + commands + '\r\n'
NameError: name 'commands' is not defined

Наконец, просто чтобы пролить некоторый контекст на ситуацию:

Я пишу небольшое приложение с графическим интерфейсом в Glade и Python/PyGTK для управления шаговым двигателем через последовательный порт с помощью модуля PySerial. Однако я хотел бы упаковать свою собственную функцию «записи», чтобы я мог добавлять значения по умолчанию к «отправить» по кабелю. Например, номер двигателя и всегда добавление возврата в конце инструкции. Другие вещи, такие как прямое чтение ответа в той же функции, также были бы полезны для оценки ответов, поэтому было бы разумно заключить его в пользовательскую функцию.

Буду признателен за любые советы или помощь по вышеизложенному.

Спасибо-любезно.

Энди

ОБНОВЛЕНИЕ: у меня есть решение исходной проблемы, связанной с тем, что я не включил «я», и мне удалось заставить Стек принимать вкладки, которые я обычно использую, поэтому его чище для просмотра. Также хотел отметить, что единственный код, который я удалил, был простой установкой переменной. Однако проблема осталась!


person Schodemeiss    schedule 30.06.2010    source источник
comment
Название вашей темы немного вводит в заблуждение; дело не в том, что команда не определена, а в том, что переменная commands не определена в вашем методе send_command. Я не уверен, почему это происходит. Я посмотрю глубже. Вы пробовали использовать другое имя для аргумента? возможно, замените его на foo и посмотрите, работает ли он.   -  person Justin L.    schedule 30.06.2010
comment
Какова фактическая ошибка после обновления кода? Не удается найти nanotech или motor_no?   -  person Daniel Roseman    schedule 30.06.2010


Ответы (3)


Это может быть потому, что вам не хватает аргумента self:

  def send_command(self, commands):
person Ryan Ginstrom    schedule 30.06.2010

у вас есть ошибка отступа в def send_command(commands):

и ваш первый параметр должен быть "self":

class ArialApp(object):

<snap>

    def send_command(self, commands):
        ser.write("#" + motor_no + commands + '\r\n')
person dzen    schedule 30.06.2010
comment
Странно, оказалось что-то странное с табуляцией, используемой в моем коде, как только я буквально перепечатал ее, она работает нормально! Должно быть, проблема с интервалом. Можете ли вы предложить хорошую IDE для Python, кроме Eclipse, которая явно не очень хороша?! - person Schodemeiss; 30.06.2010
comment
Я использую vim/gvim или textmate (на macos). на этом сайте вы найдете несколько вопросов о python ide :) - person dzen; 01.07.2010

Во-первых, вы должны использовать более одного пробела для отступа. Пробелы имеют большое значение в Python, и очень трудно понять, правильно ли вы их поняли, если используете только один пробел. Четыре – обычно принимаемая сумма.

Основная проблема с вашим методом send_command заключается в том, что вы забыли, что первым аргументом любого метода в Python является (по соглашению) self. Итак, подпись должна быть:

def send_command(self, commands):

Однако код, который вы показали, не выдаст указанную вами ошибку: вместо этого он выдаст следующее:

TypeError: send_command() takes exactly 1 argument (2 given)

Кроме того, в вашем методе не определено не commands, а motor_no. Вот почему всегда важно показывать фактический код, который вы используете, урезанный настолько, чтобы действительно воспроизвести ошибку.

person Daniel Roseman    schedule 30.06.2010