Найти - Пользователи
Полная версия: В чем различие между консольным режимом и скриптом?
Начало » Python для новичков » В чем различие между консольным режимом и скриптом?
1 2
vivl
Работаю в линуксе. Подключаю ардуину, делаю так:
python
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600)
>>> ser.write('1')
и вижу что данные приходят на железку и все работает как нужно. Но как только я записываю это дело в скрипт:
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write('1')
ser.close()
запускаю его python script.py, то железка не откликается.
при этом если в другом консольном окне инициализировать вышеописанным образом порт, то все работает. В чем дело?
Singularity
sudo ? или
import serial
def main():
    ser = serial.Serial('/dev/ttyUSB0', 9600)
    ser.write('1')
    ser.close()
if __name__ == '__main__':
    main()
vivl
Там все судо. А вот код реально помог. Можно подробно обьяснить в чем же затык вышел? Что значит строка
 if __name__ == '__main__':
Хотя почитал что это значит но так и не понял почему она столь критичной оказалась )
py.user.next
vivl
но так и не понял почему она столь критичной оказалась
должно всё без неё срабатывать

vivl
запускаю его python script.py, то железка не откликается
может, повисла
s0rg
vivl
>>> ser.write('1')
vivl
ser.close()
Вы уверенны что из скрипта данные _успели_ записаться до того как вы вызвали close?
py.user.next
s0rg
Вы уверенны что из скрипта данные _успели_ записаться до того как вы вызвали close?
чего ?

.write() наверняка блокирующий, иначе что это за модуль
sp3
Мжт порт уже открыт?
Singularity
Может топик-стартер не все сказал или не так понял ?
s0rg
py.user.next
чего ?
Не вижу других причин, чтобы один и тот же код работал в консоли и не работал в скрипте.
Можно еще принудительно данные впихнуть.
vivl
Вообще
 if __name__ == '__main__':
мне помогло.
Сначала я подумал что проблема в флаге иинциализации контроллера железки, так как заметил, что если сначала выполнить комманду
stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl
, то скрипт тоже начинает срабатывать. Я уже успел даже костыль в скрипте сделать такого плана:
cmd = 'stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl'
import subprocess
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell = True)
p.wait()
Что в принципе тоже помогло. Но потом я заметил, что после перезагрузки линукса и до того как я запустил эту комманду инициализации и выполнил вышеописанные комманды в консольном режиме, у меня тоже все заработало. Так что я решил, что дело таки не в инициализации. Потом я попробывал
import serial
def main():
    ser = serial.Serial('/dev/ttyUSB0', 9600)
    ser.write('1')
    ser.close()
if __name__ == '__main__':
    main()
И все заработало. Сейчас я еще раз все перепроверю. Может я случайно в крон пихнул
stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl
? Но я перепроверю и отпишусь.
UPD. Действительно, если добавляю
if __name__ == '__main__':
, все пашет, а если убираю - нет. Может действительно, скрипт байт дослать до конца не успевает и порт закрывается? И кстати, если в другом окне открыть к примеру консоль на этом же девайсе и сделать:
python 
>>>ser = serial.Serial('/dev/ttyUSB0', 9600)
,
то скрипт будет выполняться в любом случае. Может, у меня не успевает порт инициализироваться и я уже начинаю туда байты слать? Или исключено?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB