我可以在Perl中设置一个telnet连接没有问题,刚刚发现了Curses,我想知道我是否可以一起使用这两个连接来从telnet会话中获取输出.
我可以使用下面的简单脚本在行,列的基础上查看STDOUT的内容:
use Curses;
my $win = new Curses;
$win->addstr(10, 10, 'foo');
$win->refresh;
my $thischar=$win->inch(10,10);
print "Char $thischar\n";
Run Code Online (Sandbox Code Playgroud)
使用下面我可以打开一个telnet连接并发送\ receive命令没有问题:
use net::telnet;
my $telnet = new Net::Telnet (Timeout => 9999,);
$telnet->open($ipaddress) or die "telnet open failed\n";
$telnet->login($user,$pass);
my $output = $telnet->cmd("command string");
Run Code Online (Sandbox Code Playgroud)
...但我真正想做的是获取telnet响应(包括终端控制字符),然后使用curses在行/列上搜索.有谁知道我可以将两者连接在一起的方式?在我看来,curses只能在STDOUT上运行
我正在尝试构建5.6.4-labs-innodb-memcached,但遇到此问题:
# cmake ./
-- MySQL 5.6.4-labs-innodb-memcached
-- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:83 (MESSAGE):
Curses library not found. Please install appropriate package,
remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5- dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
cmake/readline.cmake:127 (FIND_CURSES)
cmake/readline.cmake:217 (MYSQL_USE_BUNDLED_LIBEDIT)
CMakeLists.txt:263 (MYSQL_CHECK_READLINE)
-- Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)
安装了libncurses5-dev并设置了CURSES_USE_NCURSES = true,但它没有帮助.有任何想法吗?我已经编译了这个包,但它是在另一台机器上...
编辑:
/var/cache/apt/archives/libncurses5-dev_5.7+20101128-1_i386.deb
/var/lib/dpkg/info/libncurses5.postinst
/var/lib/dpkg/info/libncursesw5.list
/var/lib/dpkg/info/ncurses-base.preinst
/var/lib/dpkg/info/libncursesw5.postrm
/var/lib/dpkg/info/libncursesw5.shlibs
/var/lib/dpkg/info/libncursesw5.md5sums
/var/lib/dpkg/info/libncurses5.symbols
/var/lib/dpkg/info/ncurses-bin.preinst
/var/lib/dpkg/info/ncurses-bin.list
/var/lib/dpkg/info/libncurses5-dev.list
/var/lib/dpkg/info/libncursesw5.symbols
/var/lib/dpkg/info/libncursesw5.postinst …
Run Code Online (Sandbox Code Playgroud) 我对诅咒很陌生,所以我在python中尝试了一些不同的东西.
我初始化了窗口并为window对象设置了scrollok.我可以添加字符串,并且滚动工作,以便addstr()在窗口的末尾没有任何错误.
我想要的是能够在程序完成后在我的终端程序(tmux或KDE Konsole,在本例中)中滚动回程序输出.
在我的代码中,如果我跳过endwin()调用,我至少可以看到输出,但是终端需要重置调用才能恢复运行.
此外,即使在程序运行时,在curses窗口向下滚动之后,我也无法在Konsole中向后滚动以查看初始输出.
#!/usr/bin/env python2
import curses
import time
win = curses.initscr()
win.scrollok(True)
(h,w)=win.getmaxyx()
h = h + 10
while h > 0:
win.addstr("[h=%d] This is a sample string. After 1 second, it will be lost\n" % h)
h = h - 1
win.refresh()
time.sleep(0.05)
time.sleep(1.0)
curses.endwin()
Run Code Online (Sandbox Code Playgroud) 我正在使用curses编写一个Python蛇游戏,但是在控制蛇方面遇到了一些麻烦,我当前控制蛇的代码放在主循环中,看起来像这样:
while True:
char = screen.getch()
if char == 113: exit() # q
elif char == curses.KEY_RIGHT: snake.update(RIGHT)
elif char == curses.KEY_LEFT: snake.update(LEFT)
elif char == curses.KEY_UP: snake.update(UP)
elif char == curses.KEY_DOWN: snake.update(DOWN)
else snake.update()
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
然而,代码似乎将按下的键视为一个que(因此当它用完箭头时蛇会停止),而我实际上希望它检索被按下的最后一个箭头键.
如何检索按下的最后一个箭头键?
我正在构建一个python curses应用程序.
我有两种打印到curses窗口的方法:print x
和windows.addstr(x)
(以及其他类似的window.*
选项).
但是,出于调试目的,我希望能够打印到标准控制台,所以当我退出curses窗口时,我有等待我的信息.我通常会使用print x
,但打印到curses窗口.
sys.stout.write()
也失败了.
我怎样才能做到这一点?
使用完sys.stdout
之后os.fdopen
,这是追溯
curses.nocbreak()
_curses.error: nocbreak() returned ERR
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C++学习curses库(pdcurses,因为我在Windows操作系统中).我有一个显示3个窗口的程序,然后是一个while循环,根据getch()捕获的按键进行一些处理.按下F1键时循环退出.
然而,尽管使用wrefresh()刷新所有三个窗口,但在我进入第一次按键之前没有任何内容出现.没有while循环,一切都显示正常.我做了很多测试,这就像第一次调用getch()将完全清除屏幕,而不是后续屏幕.
我的问题是:我错过了什么?起初,我在想,也许getch()调用了一个隐式的refresh(),但为什么后续调用它没有相同的行为呢?
非常感谢您的帮助.
这是代码.
#include <curses.h>
int main()
{
initscr();
raw();
keypad(stdscr, TRUE);
noecho();
curs_set(0);
WINDOW *wmap, *wlog, *wlegend;
int pressed_key;
int map_cursor_y = 10, map_cursor_x = 32;
wlog = newwin(5, 65, 0, 15);
wlegend = newwin(25, 15, 0, 0);
wmap = newwin(20, 65, 5, 15);
box(wmap, 0 , 0);
box(wlog, 0 , 0);
box(wlegend, 0 , 0);
mvwprintw(wlog, 1, 1, "this is the log window");
mvwprintw(wlegend, 1, 1, "legends");
mvwaddch(wmap, map_cursor_y, map_cursor_x, '@');
wrefresh(wlog);
wrefresh(wmap);
wrefresh(wlegend);
while ((pressed_key …
Run Code Online (Sandbox Code Playgroud) 使用Python,我试图使用addstr()将光标位置写入我的curses窗口的右下角但是我收到错误.ScreenH-2
工作正常,但从挡风玻璃底部打印到第二行. ScreenH-1
根本不起作用.我究竟做错了什么?
import curses
ScreenH = 0
ScreenW = 0
CursorX = 1
CursorY = 1
def repaint(screen):
global ScreenH
global ScreenW
global CursorX
global CursorY
ScreenH, ScreenW = screen.getmaxyx()
cloc = ' ' + str(CursorX) + ':' + str(CursorY) + ' '
cloclen = len (cloc)
screen.addstr (ScreenH - 1, ScreenW - cloclen, cloc, curses.color_pair(1));
def Main(screen):
curses.init_pair (1, curses.COLOR_WHITE, curses.COLOR_BLUE)
repaint (screen)
while True:
ch = screen.getch()
if ch == ord('q'):
break
repaint (screen)
curses.wrapper(Main) …
Run Code Online (Sandbox Code Playgroud) 我有一个bash脚本打印一个漂亮的大彩色表,使用转义代码生成前景和背景tput
.我的curses应用程序需要调用此bash脚本并将输出放在屏幕上.
当我尝试这样做时,curses会以堆栈跟踪结束爆炸:
File "./dostuff.py", line 38, in print_art
screen.addstr(y, x_start, line)
TypeError: must be str, not bytes
Run Code Online (Sandbox Code Playgroud)
其中"线"是这样的:
'\x1b[44m\x1b[30mcard major minor revision runs updated\x1b(B\x1b[m\x1b(B\x1b[m\n'
有没有办法让诅咒解释这些颜色代码?我可以使用颜色代码对字符串进行任何处理以使curses显示它吗?或者我必须基本上从bash脚本中删除颜色,然后重新实现python中的着色?
编辑:
获取bash输出的命令类似于:
print_art(subprocess.Popen(["./automount", "backup", "list"], stdout=subprocess.PIPE).communicate()[0])
Run Code Online (Sandbox Code Playgroud)
通过调用decode()
字节字符串,我可以使用curses来打印字符串,尽管有文字转义序列.除非我听到其他人的意见,否则我只是手动解析这些文字转义序列并转换为使用curses颜色方法.
我有一个名为 samtools(1.3 版)的程序,用于操作您从 DNA 测序实验中获得的文件。
下载的程序包含在一个文件夹中。为了设置程序,我在终端(在 ubuntu 计算机上)输入该文件夹。我输入突击队“制造”。
它运行打印它所做的事情,但以错误消息终止:
bam_tview_curses.o bam_tview_curses.c
bam_tview_curses.c:41:20: fatal error: curses.h: No such file or directory
#include <curses.h>
^
compilation terminated.
make: *** [bam_tview_curses.o] Error 1
Run Code Online (Sandbox Code Playgroud)
我最初的反应(在互联网上搜索后)是没有安装 curses,我尝试使用 sudo 来解决这个问题(显然我的用户不在 sudoers 列表中。
所以我试着看看curses是否已经安装,在查阅互联网后我尝试了
ldconfig -p | grep ncurses
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
libncursesw.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/libncursesw.so.5
libncurses.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/libncurses.so.5
Run Code Online (Sandbox Code Playgroud)
我认为这是因为安装了诅咒。但这让我不知所措。但这至少应该意味着存在诅咒,对吗?我在使用 ubuntu 或 C 程序方面不是很有经验(很久以前我在 C 方面上了一个较小的课程,虽然我已经使用了相当多的 linux 计算机,但我主要使用终端进行导航)
乐于助人!