如何在Python中获取man手册的内容?

3

我正在使用Linux,想要将一些手册页面导入到我的应用程序中。

我想到了以下方法:

p = subprocess.Popen(('man %s' % manTopic,), shell = True, stdout = subprocess.PIPE)
stdout, stderr = p.communicate()
if stdout:

但这没用,人只显示第一页并阻止了我的应用程序。

我如何使用Python获取man页面?


1
格式方面怎么样? 需要保留还是需要去除? - Lukas Graf
2个回答

9
你可以使用check_output获取命令的全部输出。此外,不必使用shell,这样甚至可能会使您的应用程序容易受到shell注入攻击而被强烈反对
import subprocess

pagename = 'man'
manpage = subprocess.check_output(['man', pagename])

注意使用man会给你一个终端格式的输出。如果您想要不同格式的输出,您需要:
  • 调用man -w <name>来获取手册页面的位置,
  • 可能需要解压缩手动页面,
  • 使用-T选项将其提供给groff以选择所需的输出类型。
调用groff时,请不要忘记加载正确的宏。
在FreeBSD上,我倾向于使用groff -Tlatin1 -mandoc <file>来获得文本输出。

+1 如果处理格式并提到“groff -T...”,并使用“man -w”让“man”执行查找并返回路径,然后自行处理。 - Lukas Graf
哦,当然还要提到shell=True的安全隐患。我的+3按钮在哪里? - Lukas Graf
我正在使用Python 2.6,没有subprocess.check_output() :] - BPS
@user775023 这是CPython中check_output()的源代码:subprocess.py#l549 - Lukas Graf

3

尝试:

p = subprocess.Popen(('man -P cat %s' % manTopic,), shell = True)
stdout, stderr = p.communicate()
if stdout:

相反地,"-P"选项覆盖了"man"命令使用的分页程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接