UniCurses на Python 3 под windows
Модераторы: Sanja, Максим Кич
UniCurses на Python 3 под windows
Здравствуйте, возникла такая проблема: не могу запустить сабж. Что делал:
1. Скачал и установил UniCurses https://sourceforge.net/projects/pyunicurses/
2. Скачал PDCurses https://github.com/Chiel92/unicurses
3. Скопировал содержимое папки pdc34dllu по следующим путям:
C:\Python3
C:\Python3\Lib\site-packages
C:\Python3\Lib\site-packages\unicurses
C:\Python3\Lib\curses
При запуске скрипта из C:\Python3\Lib\site-packages выдает:
============== RESTART: C:\Python3\Lib\site-packages\Console.py ==============
=============================== RESTART: Shell ===============================
>>>
При запуске из других мест выдает:
============ RESTART: C:/Users/Vapekreng/Desktop/console_blank.py ============
Fatal error: can't find pdcurses.dll for linking, make sure PDCurses v3.4+ is in the same folder as UniCurses if you want to use UniCurses on a win32 platform.
Traceback (most recent call last):
File "C:\Python3\lib\site-packages\unicurses.py", line 43, in <module>
import curses # see if the platform supports curses natively
File "C:\Python3\lib\curses\__init__.py", line 13, in <module>
from _curses import *
ImportError: No module named '_curses'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/Vapekreng/Desktop/console_blank.py", line 1, in <module>
import unicurses
File "C:\Python3\lib\site-packages\unicurses.py", line 54, in <module>
raise ImportError("UniCurses initialization error - pdcurses.dll not found.")
ImportError: UniCurses initialization error - pdcurses.dll not found.
Ну и сам скрипт, который пытаюсь запустить:
import unicurses
stdscr = unicurses.initscr()
stdscr.clear()
unicurses.noecho()
unicurses.cbreak()
stdscr.keypad(True)
print('Hello world!')
print('Привет, мир!')
stdscr.refresh()
stdscr.getkey()
unicurses.getch()
stdscr.keypad(False)
unicurses.nocbreak
unicurses.echo()
unicurses.endwin()
Подскажите: куда скинуть библиотеку, чтобы питон видел её и не приходилось бы работать строго в папке с этой библиотекой. А так же, если можно, напишите скрипт, который выводил бы в консоль Hello world и ожидал нажатия любой клавиши. Заранее всем спасибо
1. Скачал и установил UniCurses https://sourceforge.net/projects/pyunicurses/
2. Скачал PDCurses https://github.com/Chiel92/unicurses
3. Скопировал содержимое папки pdc34dllu по следующим путям:
C:\Python3
C:\Python3\Lib\site-packages
C:\Python3\Lib\site-packages\unicurses
C:\Python3\Lib\curses
При запуске скрипта из C:\Python3\Lib\site-packages выдает:
============== RESTART: C:\Python3\Lib\site-packages\Console.py ==============
=============================== RESTART: Shell ===============================
>>>
При запуске из других мест выдает:
============ RESTART: C:/Users/Vapekreng/Desktop/console_blank.py ============
Fatal error: can't find pdcurses.dll for linking, make sure PDCurses v3.4+ is in the same folder as UniCurses if you want to use UniCurses on a win32 platform.
Traceback (most recent call last):
File "C:\Python3\lib\site-packages\unicurses.py", line 43, in <module>
import curses # see if the platform supports curses natively
File "C:\Python3\lib\curses\__init__.py", line 13, in <module>
from _curses import *
ImportError: No module named '_curses'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/Vapekreng/Desktop/console_blank.py", line 1, in <module>
import unicurses
File "C:\Python3\lib\site-packages\unicurses.py", line 54, in <module>
raise ImportError("UniCurses initialization error - pdcurses.dll not found.")
ImportError: UniCurses initialization error - pdcurses.dll not found.
Ну и сам скрипт, который пытаюсь запустить:
import unicurses
stdscr = unicurses.initscr()
stdscr.clear()
unicurses.noecho()
unicurses.cbreak()
stdscr.keypad(True)
print('Hello world!')
print('Привет, мир!')
stdscr.refresh()
stdscr.getkey()
unicurses.getch()
stdscr.keypad(False)
unicurses.nocbreak
unicurses.echo()
unicurses.endwin()
Подскажите: куда скинуть библиотеку, чтобы питон видел её и не приходилось бы работать строго в папке с этой библиотекой. А так же, если можно, напишите скрипт, который выводил бы в консоль Hello world и ожидал нажатия любой клавиши. Заранее всем спасибо
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: UniCurses на Python 3 под windows
Насколько я вижу, не надо смешивать п. 1 (sf.net/pyunicurses) и п. 2 (Chiel92/unicurses). Оба как минимум работают без установки. В первом случае надо скопировать в папку своего проекта unicurses.py (это он будет импортирован как модуль) а рядом положить .dll с официального сайта PDCurses. Во втором случае репозиторий товарища Chiel92 представляет собой предзаготовленный набор обертки и нескольких библиотек, надо скопировать папку unicurses из репозитория к себе в проект (это она будет импортирована как модуль), .dll оно найдет само в недрах самого себя же.
Наверняка оно работает и если устанавливать в site-packages, но готовых пакетов я не вижу и особого смысла тогда тоже. Вариант 2 (Chiel92, папка unicurses) работает, если вызывать и не из директории проекта.
Edit: только сейчас заметил, что вопрос был чтобы "не приходилось бы работать строго в папке с этой библиотекой". Что же, насколько вижу тогда выбора нет, надо использовать вариант с гитхаба: он тащит .dll с собой и ищет в относительных путях, т. е. у себя же внутри. Если положить эту папку unicurses в PYTHONPATH (точнее, в sys.path, site-packages как раз там), то все найдется. Вариант же с sf.net (он еще и старый, 2010 года) только подгружает .dll по имени, так что без правки кода обертки или телодвижений с PATH работать не из папки проекта оно не будет.
Теперь к примерам. Приведенный код не работает по нескольким причинам. Во-первых, функции в обертке не принадлежат дескриптору окна (или что такое stdscr в curses?), а просто находятся в модуле. Соответственно вместо stdscr.clear() надо писать unicurses.clear(). Во-вторых, print это такая функция в самом Python, так что 'Привет, мир' просто не попадает в unicurses. Надо использовать [mv]addstr или какие там еще функции вывода в curses.
Т. е. минимальный hello, world выглядит примерно так:Правда с выводом кириллицы беда. Вроде есть варианты .dll "The PDCurses with Unicode[/UTF-8] support", но они просто разные козюбрики у меня показывают. В зависимости от консоли/терминала иногда даже китайские.
---
А теперь на правах рекламы. Отставьте *curses в сторону и поддержите отечественного производителя: BearLibTerminal(input.filter нужен ради эффектного закрытия "нажатием любой клавиши", просто по умолчанию в read() валятся и события мыши; наверное более логичным значением по умолчанию было бы приведенное выше)
Наверняка оно работает и если устанавливать в site-packages, но готовых пакетов я не вижу и особого смысла тогда тоже. Вариант 2 (Chiel92, папка unicurses) работает, если вызывать и не из директории проекта.
Edit: только сейчас заметил, что вопрос был чтобы "не приходилось бы работать строго в папке с этой библиотекой". Что же, насколько вижу тогда выбора нет, надо использовать вариант с гитхаба: он тащит .dll с собой и ищет в относительных путях, т. е. у себя же внутри. Если положить эту папку unicurses в PYTHONPATH (точнее, в sys.path, site-packages как раз там), то все найдется. Вариант же с sf.net (он еще и старый, 2010 года) только подгружает .dll по имени, так что без правки кода обертки или телодвижений с PATH работать не из папки проекта оно не будет.
Теперь к примерам. Приведенный код не работает по нескольким причинам. Во-первых, функции в обертке не принадлежат дескриптору окна (или что такое stdscr в curses?), а просто находятся в модуле. Соответственно вместо stdscr.clear() надо писать unicurses.clear(). Во-вторых, print это такая функция в самом Python, так что 'Привет, мир' просто не попадает в unicurses. Надо использовать [mv]addstr или какие там еще функции вывода в curses.
Т. е. минимальный hello, world выглядит примерно так:
Код: Выделить всё
from unicurses import *
stdscr = initscr()
noecho()
cbreak()
mvaddstr(2, 1, 'Hello, world')
refresh()
getch()
endwin()
---
А теперь на правах рекламы. Отставьте *curses в сторону и поддержите отечественного производителя: BearLibTerminal
Код: Выделить всё
pip install bearlibterminal
Код: Выделить всё
from bearlibterminal import terminal as T
T.open()
T.set('input.filter=[keyboard, close]')
T.printf(2, 1, 'Привет, мир')
T.refresh()
T.read()
T.close()
Пытается раскуклиться
Re: UniCurses на Python 3 под windows
Благодарю за развернутый ответ, узнал несколько полезных вещей
Первоначально писал на FPC, но возникли проблемы с кирилицей и очень напряжно было все динамические объекты ручками через указатели создавать, да и код разросся неимоверно, поэтому решил перейти на что-нибудь поновее. В итоге это оказался питон. Проблему вчера, а вернее уже сегодня, в 3 ночи решил кардинально - поставил Убунту))) Сейчас вот осваиваюсь по-маленьку.
BearLib заинтересовал - там с кирилицей все ок? Просто хочется на русском сделать. А от библиотеки, в принципе, мне нужен вывод определенного символа на заданную позицию на экране определенным цветом. Если она это может, то будем осваивать.
И еще один вопрос: какой IDE выбрать? Учитывая, что это будет мой первый проект на питоне, желательно что-нибудь попроще.
Первоначально писал на FPC, но возникли проблемы с кирилицей и очень напряжно было все динамические объекты ручками через указатели создавать, да и код разросся неимоверно, поэтому решил перейти на что-нибудь поновее. В итоге это оказался питон. Проблему вчера, а вернее уже сегодня, в 3 ночи решил кардинально - поставил Убунту))) Сейчас вот осваиваюсь по-маленьку.
BearLib заинтересовал - там с кирилицей все ок? Просто хочется на русском сделать. А от библиотеки, в принципе, мне нужен вывод определенного символа на заданную позицию на экране определенным цветом. Если она это может, то будем осваивать.
И еще один вопрос: какой IDE выбрать? Учитывая, что это будет мой первый проект на питоне, желательно что-нибудь попроще.
Re: UniCurses на Python 3 под windows
Говорят продукты JetBrains в качестве IDE отлично заходят. В твоем случае это будет PyCharm. Сам пользуюсь CLion и IntelliJ IDEA для C/C++ и Java от них же. В принципе доволен как слон, так что пробуй в любом случае.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: UniCurses на Python 3 под windows
С кириллицей все хорошо, при использовании python3 достаточно не напутать с кодировкой исходных текстов (а лучше просто все всегда в UTF-8 хранить). С выводом текста и символов предлагаю просто пробежаться по списку функций, там их всего ничего (описание как бы для С, но разница невелика).vapekreng писал(а):BearLib заинтересовал - там с кирилицей все ок? Просто хочется на русском сделать. А от библиотеки, в принципе, мне нужен вывод определенного символа на заданную позицию на экране определенным цветом.
Соглашусь с рекомендацией PyCharm, все в этой IDE просто и по делу.vapekreng писал(а):И еще один вопрос: какой IDE выбрать?
(А вот с CLion пока не задалось, наши древние корпоративные многоэтажные макросы и шаблоны Eclipse перемалывает надежнее. Но это уже совсем другая история.)
Пытается раскуклиться
Re: UniCurses на Python 3 под windows
Ох и тяжко дается переход на новый ЯП...
Подскажите, что я делаю не так?
Подскажите, что я делаю не так?
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Последний раз редактировалось vapekreng 22 авг 2016, 20:45, всего редактировалось 2 раза.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: UniCurses на Python 3 под windows
Прячьте огромные картинки в тег
Скрытый текст: ПОКАЗАТЬ
Пытается раскуклиться
Re: UniCurses на Python 3 под windows
За картинки извиняюсь-поправил.
Спасибо огромное за терпение! С проблемой разобрался - PIp установил библиотеку для второго питона, а я пользуюсь третьим, поэтому ошибку и выдавало. На втором питоне "Hello world!" заработал. Не подскажете, как эту библиотеку для третьего питона установить?
Спасибо огромное за терпение! С проблемой разобрался - PIp установил библиотеку для второго питона, а я пользуюсь третьим, поэтому ошибку и выдавало. На втором питоне "Hello world!" заработал. Не подскажете, как эту библиотеку для третьего питона установить?
Re: UniCurses на Python 3 под windows
Curses, кстати, тоже во втором заработали, а в третьем ни то ни другое не работает...
Код: Выделить всё
import curses
myscreen = curses.initscr()
myscreen.border(0)
myscreen.addstr(12, 25, "Hello world!")
myscreen.refresh()
myscreen.getch()
curses.endwin()
Код: Выделить всё
from bearlibterminal import terminal
terminal.open()
terminal.printf(5, 5, "Hello world")
terminal.refresh()
Re: UniCurses на Python 3 под windows
Pip мне выдает:
Requirement already satisfied (use --upgrade to upgrade): bearlibterminal in ./.local/lib/python2.7/site-packages
Беру оттуда путь и пробую добавить:
Не получается...
Requirement already satisfied (use --upgrade to upgrade): bearlibterminal in ./.local/lib/python2.7/site-packages
Беру оттуда путь и пробую добавить:
Код: Выделить всё
import sys
sys.path.append("./.local/lib/python2.7/site-packages")
from bearlibterminal import terminal
terminal.open()
terminal.printf(5, 5, "Hello world!")
terminal.refresh()
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: UniCurses на Python 3 под windows
Хм, вечно забываю про этот момент. Утилита pip у python2 и python3 разная, для третьего питона она называется pip3. Оно может отсутствовать в системе, но убунта подскажет как и какой пакет надо установить.vapekreng писал(а):Не подскажете, как эту библиотеку для третьего питона установить?
Это оно выдает потому что pip тот же самый, для python2, а для него "зависимость" действительно уже выполнена, раз пакет библиотеки установлен. Слова про флаг --upgrage это напоминание как обновить пакет библиотеки до самой свежей версии, если выйдет новая. Ну а сообщение, где оно лежит это больше дебажная информация на всякий случай.vapekreng писал(а):Pip мне выдает:
Requirement already satisfied (use --upgrade to upgrade): bearlibterminal in ./.local/lib/python2.7/site-packages
Вообще, я посоветую не пытаться сразу выполнять какие-либо неочевидные действия, если что-то не заработало с первого раза. Если внезапно становится слишком коряво и сложно -- это хороший повод остановиться и подумать, где-то что-то пошло не так =).
Кстати, трюк с sys.path.append вполне бы сработал, если был бы указан полный путь от самого корня, а не относительный. Но это так, на заметку, так делать не надо.
Пытается раскуклиться
Re: UniCurses на Python 3 под windows
Заработало на третьем! Огромное вам человеческое спасибо! Будем осваивать ваш терминал)))
Re: UniCurses на Python 3 под windows
Извиняюсь, если вопрос покажется глупым, но только начинаю осваиваться в пайтоне, раньше дальше TP не забирался. Возникло несколько вопросов для прояснения того, как все происходит и для более ясного понимания. Вот пример:
1. Первая строчка подключает из библиотеки bearlibterminal модуль terminal и берет оттуда функции. Модулей в библиотеке может быть несколько, поэтому явно указываем какой именно нам нужен.
2. Вторая строка нужна для импорта констант из модуля, без него не распознается TK_ESCAPE.
3. Если я использую в каком-то своем модуле модуль terminal, то мне нужно будет импортировать его заново.
4. Команда terminal.open() используется только 1 раз в самом начале для создания окна терминала
Если я в чем-то ошибаюсь, просьба поправить, заранее спасибо
PS Спасибо за наводку на PyCharm - удобная вещь!
Код: Выделить всё
from bearlibterminal import terminal
from bearlibterminal.terminal import *
def main_loop():
key = terminal.read()
while key != TK_ESCAPE:
key = terminal.read()
2. Вторая строка нужна для импорта констант из модуля, без него не распознается TK_ESCAPE.
3. Если я использую в каком-то своем модуле модуль terminal, то мне нужно будет импортировать его заново.
4. Команда terminal.open() используется только 1 раз в самом начале для создания окна терминала
Если я в чем-то ошибаюсь, просьба поправить, заранее спасибо
PS Спасибо за наводку на PyCharm - удобная вещь!
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: UniCurses на Python 3 под windows
1, 2. Достаточно первой строчки импорта. Вторая импортирует все функции и константы терминала прямо в глобальную область видимости, в чем нет явной необходимости: константы доступны так же, как и функции, через terminal.TK_xxx. Насколько я знаю Python, конструкция не в почете. Она добавляет в общую область видимости все подряд, например в случае с терминалом это функции с такими банальными именами, как open, close, put, get и пр.
Если не хочется постоянно писать terminal.xyz, то в качестве компромисса возможно
3. Да, нужно импортировать в каждом модуле. Но дублироваться все равно ничего не будет, это будет один и тот же terminal, так что можно импортировать сколько угодно.
4. Верно, один раз. Окно там действительно создается, но до первого refresh() его не будет видно на экране -- это позволяет произвести всю необходимую настройку окна (шрифт, размеры и т. д.) и потом разом показать уже готовое.
Касаемо цикла: довольно странно, что read() встречается дважды. Если цель только обрабатывать ввод пока не будет нажато что-то, то могу предложить такую формулировку:Чем это лучше? Один вызов read() и вся обработка на одном уровне, в том числе и разные условия выхода.
Код: Выделить всё
from ... import *
Если не хочется постоянно писать terminal.xyz, то в качестве компромисса возможно
Код: Выделить всё
from bearlibterminal import terminal as T
if T.read() == T.TK_CLOSE:
return
4. Верно, один раз. Окно там действительно создается, но до первого refresh() его не будет видно на экране -- это позволяет произвести всю необходимую настройку окна (шрифт, размеры и т. д.) и потом разом показать уже готовое.
Касаемо цикла: довольно странно, что read() встречается дважды. Если цель только обрабатывать ввод пока не будет нажато что-то, то могу предложить такую формулировку:
Код: Выделить всё
def main_loop():
while True:
key = terminal.read()
if key == terminal.TK_ESCAPE:
break
elif ...
Пытается раскуклиться
Re: UniCurses на Python 3 под windows
по второму пункту ошибку понял - я обращался к константе напрямую, не указав имя модуля, поправил на terminal.TK_ESCAPE и заработало, не подумал об этом. Импорт всего подряд самому не по душе - понимаю прекрасно, что имена могут совпадать, а это далеко не гуд.
По поводу двойного использования terminal.read() - в пайтоне отсутствует конструкция
поэтому первый вызов сделал перед циклом. К break душа не лежит - стараюсь не использовать. Кстати, это стандартная конструкция?
Я имею в виду использование break вместе с while для замены repeat? Если да - буду переучиваться.
За разъяснения большое спасибо, обидно бывает, когда знаешь, что нужно сейчас делать, но не знаешь, как именно реализовать это в данном ЯП... Иногда даже вопрос сформулировать трудно
Из успехов: собачка весело бегает по экрану
На очереди зону видимости перенести из своего паскалевскго модуля.
По поводу двойного использования terminal.read() - в пайтоне отсутствует конструкция
Код: Выделить всё
repeat
...
until
Код: Выделить всё
def main_loop():
while True:
key = terminal.read()
if key == terminal.TK_ESCAPE:
break
elif ...
За разъяснения большое спасибо, обидно бывает, когда знаешь, что нужно сейчас делать, но не знаешь, как именно реализовать это в данном ЯП... Иногда даже вопрос сформулировать трудно
Из успехов: собачка весело бегает по экрану
На очереди зону видимости перенести из своего паскалевскго модуля.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 35 гостей