import os
l = os.environ['PATH'].split(';') for i in l:
print(i)
Здесь os.environ['PATH'] это содержимое переменной окружения, где пути отделены друг от друга символом точки с запятой ';'. Метод split() генерирует список l по этому разделителю. Цикл for выведет содержимое списка.
Этот код на Windows 10 выведет что-нибудь наподобие:
Это так называемые f-строки, предназначенные форматирования вывода при печати с помощью функции print(). Значения выводимых переменных и вычисленных выражений подставляются в строку с помощью фигурных скобок. Это быстрый и удобочитаемый метод динамического форматирования печатаемых сообщений.
name = "Алиса"
age = 30
sentence = f"Меня зовут {name}, и мне {age} лет." print(sentence)
Это можно сделать с помощью вот такого пользовательского класса WindowOutput:
classWindowOutput:
def__init__(self, window):
self.window = window
self.window.scrollok(True) # разрешает прокрутку окна
self.line = 0
self._text = "" defwrite(self, text):
self._text += text
if'\n'in text:
lines = self._text.split('\n')
for line in lines[:-1]: # обработка всех завершенных строк
self.window.addstr(line + '\n')
self.window.refresh()
self._text = lines[-1] # сохраняет любые оставшиеся строки defflush(self):
if self._text:
self.window.addstr(self._text)
self.window.refresh()
self._text = ""
Предположим, что у вас есть два окна curses без бордюра. Первое окно сверху, в переменной w1, высотой в одну строку, второе окно ниже, занимающее все остальное пространство экрана, в переменной w2. И нам надо, чтобы функция print выводила сообщения в нижнее окно w2.
Вспомогательные функции:
# Функция определяет общий размер экрана консоли в символах: defget_screen_size():
try:
# Инициализация библиотеки curses:
screen = curses.initscr()
# Получение высоты и ширины экрана:
height, width = screen.getmaxyx()
# Очистка curses:
curses.endwin()
return height, width except Exception as e:
print(f"Error getting screen size: {e}")
returnNone, None
# Функция создает окно curses заданного размера, # с определенным положением на экране консоли: defcreate_window(height=None, width=None, y=0, x=0, has_border=True):
try:
# Initialize curses
screen = curses.initscr()
curses.start_color()
curses.noecho()
curses.cbreak()
screen.keypad(True) # Если размеры окна не указаны, то используется экран целиком:if height isNoneor width isNone:
max_height, max_width = screen.getmaxyx()
height = height or max_height
width = width or max_width # Создание окна:
window = curses.newwin(height, width, y, x)
if has_border:
window.box()
window.refresh() return screen, window except Exception as e:
curses.endwin()
print(f"Error creating window: {e}")
returnNone, None
# Функция очистки: defcleanup_curses(screen):
if screen:
screen.keypad(False)
curses.nocbreak()
curses.echo()
curses.endwin()
Пример функции, которая создает окна w1, w2 и настраивает вывод функции print в окно w2:
if __name__ == "__main__":
# Здесь print печатает как обычно:print("Обычная печать")
myw.init_interface()
# Теперь print выводит сообщения в окно w2:print("Вывод сообщений перенаправлен")
myw.revert_interface()
print("Печать возвращена обратно в stdout")
В перехвате нажатий без блокировки поможет модуль msvcrt.
import msvcrt
# Не блокирующая проверка нажатой клавиши. Если была нажата клавиша, # то функция возвратит её символьное представление. defcheck_keyboard():
if msvcrt.kbhit(): # вернет true, если было нажатие
key = msvcrt.getch().decode('utf-8', errors='ignore').lower()
return key
returnNone
Ниже показан пример использования функции check_keyboard. Этот блок кода может быть вставлен в основной цикл программы:
whileTrue:
# Тут какие-то действия
...
key = check_keyboard() # проверка нажатия без блокировкиif key == 'q': # выход, если 'q'print("\nComparison cancelled by user")
returnelif key == 'p': # пауза, если 'p'print("\nPaused. Press any key to continue...")
msvcrt.getch() # ождание клавиши с блокировкойprint("\nContinuing comparison...")
else:
pbar.update(1)
...
Ошибка произошла из-за того, что вместо библиотеки pyserial была установлена библиотека serial. Чтобы устранить ошибку, нужно удалить библиотеку serial и установить библиотеку pyserial:
250319 13:05:02.282 info 250319 13:05:02.282 warning 250319 13:05:02.282 error
[Альтернативное решение: вывод в файл]
Модуль logging выводит текст, представленный в кодировке UTF-8. Но иногда необходимо вывести в лог текст в произвольной кодировке. Для такого случая можно использовать вывод в двоичный файл и формирование строки с датой и временем вручную, с помощью модуля datetime.
Ниже показан пример модуля log.py, где для вывода в лог произвольного текста реализована функция raw, а для вывода текста в кодировке UTF-8 реализована функция umsg.
strftime("%y%m%d %H:%M:%S") — преобразует дату и время в строку согласно указанному формату:
%y — год без века (две цифры, например, 23 для 2023 года). %m — месяц (две цифры, 01–12). %d — день месяца (две цифры, 01–31). %H — час в 24-часовом формате (00–23). %M — минуты (00–59). %S — секунды (00–59).
Пример вывода:
230601 14:30:45
Если вам нужно получить дату и время для конкретного момента (не текущего), можно создать объект datetime вручную и отформатировать его аналогично. Например:
if __name__ == "__main__":
parse_command_line()
# Проверка, если не было предоставлено аргументов,# то вывод подксказки по командной строке и выход:ifnotany(vars(args).values()):
parser.print_help()
exit(1) try:
# Тут код программы, проверяемой на возникновение ошибки:
...
except SystemExit:
passexcept Exception as e:
# Печать полной информации об ошибке: номер строки кода, где# возникла ошибка, стек вызовов, сообщение об ошибке:print(f"Error: {str(e)}\n{traceback.format_exc()}")
# Просто вывод сообщения об ошибке:#print(f"Error: {str(e)}")
revert_interface()
finally:
try:
revert_interface()
except:
pass
"Pickling" это процесс, посредством которого иерархия объектов Python преобразуется в поток байт, а "unpickling" это обратный процесс, где байтовый поток (из двоичного файла или байтового объекта) преобразуется обратно в иерархию объектов. Pickling (и unpickling) альтернативно известен как "сериализация", "маршаллинг" [1] или "выравнивание" (flattening); однако для во избежание путаницы в контексте Python используются термины "pickling" и "unpickling".
Следующий код проверялся на чипе FT232R, но вероятно будет работать и на любом чипе для виртуального последовательного порта USB:
from serial import Serial
definit_serial():
comport = Serial(port='COM1', baudrate=115200, timeout=0.1, rtscts=False, dsrdtr=False)
comport.rts = 0# установит в лог. 1 физический уровень сигнала RTS
comport.dtr = 0# установит в лог. 1 физический уровень сигнала DTRreturn comport
Ножками RTS и DTR на отладочной плате осуществлялось управление сбросом и активацией режима программирования микроконтроллера. Поэтому для сохранения связи с программой микроконтроллера понадобилось устанавливать сигналы RTS и DTR в неактивное состояние.
Обратите внимание, что эти сигналы имеют логическую инверсию уровня. Т. е. для того, чтобы установить их в лог. 1 (неактивный уровень), необходимо записать 0 в соответствующее свойство объекта serial, и наоборот.