我应该说我正在寻找解决查看不适合屏幕的输出问题的方法。例如,范围(100)将显示终端中的最后30行30高度。
我只是想朝着正确的方向前进,我很好奇你们是如何解决这个问题的。
当您遇到希望可以方便地滚动某些大输出的情况时,您做了什么?
使用终端上的回滚缓冲区。
如果您使用的是GNU Screen,可以使用defscrollback 1000
或HOME/.screenrc
中的任何其他号码进行设置。
使用Ctrl-a, [
进入复印模式
j - Move the cursor down by one line
k - Move the cursor up by one line
C-u - Scrolls a half page up.
C-b - Scrolls a full page up.
C-d - Scrolls a half page down.
C-f - Scrolls the full page down.
G - Moves to the specified line
最佳部分是?
用于反向搜索,/
用于在复制模式下进行正向搜索。
超级方便。
谢谢!
什么是bash less命令的python等价物?
LongString | less
python有类似的东西吗?我发现自己认为我可以经常使用它,但继续前进并找到其他解决方案。
“长事”是指产生比我的屏幕更多输出线的任何东西。 1000条打印消息,一本字典,一个大字符串,范围(1000)等。
我的googlefu失败了。
答案 0 :(得分:8)
只是为了好玩:o)
Python2的原始版本:
class Less(object):
def __init__(self, num_lines):
self.num_lines = num_lines
def __ror__(self, other):
s = str(other).split("\n")
for i in range(0, len(s), self.num_lines):
print "\n".join(s[i: i + self.num_lines])
raw_input("Press <Enter> for more")
less = Less(num_lines=30)
"\n".join(map(str, range(100))) | less
Python3版本:
class Less(object):
def __init__(self, num_lines):
self.num_lines = num_lines
def __ror__(self, other):
s = str(other).split("\n")
for i in range(0, len(s), self.num_lines):
print(*s[i: i + self.num_lines], sep="\n")
input("Press <Enter> for more")
less = Less(num_lines=30)
"\n".join(map(str, range(100))) | less
答案 1 :(得分:4)
如果要为交互式python会话执行此操作,则应使用允许您向上滚动的终端仿真。我相信他们中的大多数人都这样做。
如果您使用的是实际终端,或者您没有选择终端模拟器,也许您可以使用GNU screen。
(如果您使用的是Windows,则可以更改屏幕缓冲区大小以允许向上滚动至9999行。)
如果你需要这个用于程序的输出,你可以尝试使用curses模块自己实现滚动。
答案 2 :(得分:2)
是的,有一种方法,这是非常微不足道的,这就是为什么没有具体描述。假设你有很长的名单,并且只想看到开头:
>>> lst = range(1000) # let's make list of thousand elements
>>> lst[:100] # i want to see just the first 100
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> lst[100:201] # ok, now the 2nd hundred
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200]
>>> lst[-100:] # and now just the last 100, pretty please?
[900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]
相同的[]
切片对字符串的作用相同。对于字典,您可以以某种方式作弊,例如使用str()
将其转换为字符串,然后使用相同的切片显示: - )
答案 3 :(得分:1)
假设您正在使用Python编写程序,它所做的一切都是打印一些东西。输出位于prettiest_print_ever
。你已经做了奇怪的技巧导入fcntl
,termios
,struct
和朋友来获取终端大小,以便你可以使用终端的全宽(如果有的话);这也给你屏幕高度,所以使用它是有道理的。 (这也意味着你很久就放弃了任何跨平台兼容性的借口。)
当然,你可以重新发明轮子,或者你可以像其他程序一样依赖(例如git diff
)。这应该是解决方案的大纲:
def smart_print(prettiest_print_ever, terminal_height = 80):
if len(prettiest_print_ever.splitlines()) <= terminal_height:
#Python 3: make sure you write bytes!
sys.stdout.buffer.write(prettiest_print_ever.encode("utf-8"))
else
less = subprocess.Popen("less", stdin=subprocess.PIPE)
less.stdin.write(prettiest_print_ever.encode("utf-8"))
less.stdin.close()
less.wait()
答案 4 :(得分:0)
如果您在ipython工作,则可以在交互式python会话中发出shell命令。这意味着你只需要
In [1]: less myfile.txt
我也非常希望能够上下箭头来获取以前的命令并通过执行类似
之类的操作获取先前命令的输出In [33]: print cos(Out[7]*pi/180)
答案 5 :(得分:0)
在shell中运行较少与Python之间存在一个根本区别:Python是一种编程语言,而不是程序。
Bash知道控制台中的linecount是什么,并且可以查询(以及其他许多东西),Python本身不能,它是一种语言,它与其环境无关(左边)到图书馆)。
最重要的是,少遵守一些自己的标准。关注行被移到顶部,它提供给termcap,它在概念上是OS工具的一部分,即使它还没有读完文件也意味着发送到输出。
如果需要,可以在Python中编写更少的内容,或者在python脚本中运行它,但它的功能比单个文件应该包含的内容更多(而且更具体)。
答案 6 :(得分:0)
如果您的数据是json serilizable,那么您可以尝试
import simplejson
print simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)
输出看起来像
{
"shipping-line": {
"price": "0.00",
"code": "Local Pickup (Portland, OR)",
"title": "Local Pickup (Portland, OR)"
}
}
这是专门用于调试和查看实际内容......以良好的可读格式..
修改强>
如果您的屏幕限制为25行..........
import simplejson
data = simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)
cnt = 0
for line in data.split('\n'):
cnt+=1
print line
raw_input() if cnt%25==0 else None
答案 7 :(得分:-1)
自己编写很容易:
def less(s, line_count = 5):
lines = []
for i, line in enumerate(s.split('\n'), 1):
lines.append(line)
if (i % line_count) == 0:
yield '\n'.join(lines)
lines = []
if lines:
yield '\n'.join(lines)
答案 8 :(得分:-1)
当你遇到希望方便的情况时,你做了什么?滚动浏览一些大输出?
不要创建大输出。使用功能汇总或显示所选的详细信息。
简化应用程序以避免首先创建大量输出。
关注我正在考虑的内容以避免大量输出。
一般避免大输出。
避免大输出似乎比试图显示我从未关心过的东西更为简单。