1

我试图在 setup.py 的包描述中重用我的 README.rst 中的信息

在我的 setup.py 我有一个自述文件功能:

def readme():
    try:
        with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
            return f.read()
    except (IOError, OSError):
        return ''

我打电话给

setup(
    ...
    long_description=readme(),
    ...
)

因为我的reStructuredText是一个相当大的README.rst,所以只阅读重组文本的特定部分可能是一种更好的方法。

是否有一种聪明的重写方法,readme()以便它解析 README.rst 并忽略其余的 reStructuredText 格式,即只给出一小部分的纯文本?

4

2 回答 2

2

我最终得到了这个,这并不完美,但可以完成工作:

def readme():
    try:
        import docutils
    except ImportError:
        try:
            with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
                return f.read()
        except (IOError, OSError):
            return ''
    with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
        document = docutils.core.publish_doctree(f.read())
        nodes = list(document)
        description = ''
        for node in nodes:
            if str(node).startswith('<topic classes="contents"'):
                break
            if type(node) is docutils.nodes.comment\
            or type(node) is docutils.nodes.title:
                continue
            description += node.astext() + '\n'
        return  return description.encode('ascii', 'ignore').strip()

我想人们可以通过遍历 rST 文档树来进行更好和更复杂的解析。

于 2013-07-26T16:16:19.120 回答
1

我认为您可以使用 DocUtils 的这一部分:

"解析文档

Parser 分析输入文档并创建节点树表示。在这种情况下,我们使用的是 reStructuredText 解析器(docutils/parsers/rst/ init .py)。要查看该节点树的样子,我们调用 quicktest.py(可以在 Docutils 发行版的 tools/ 目录中找到),并将我们的示例文件 (test.txt) 作为第一个参数(Windows 用户可能需要键入 python quicktest .py test.txt):

$ quicktest.py test.txt 我最喜欢的语言是 Python。现在让我们检查节点树:

顶级节点是文档。它有一个值为 text.txt 的源属性。有两个子节点:段落节点和目标节点。该段落依次具有子节点:一个文本节点(“My”)、一个强调节点、一个文本节点(“language is”)、一个引用节点,以及一个 Text 节点(“.”)。

这些节点类型(文档、段落、强调等)都在 docutils/nodes.py 中定义。节点类型在内部排列为类层次结构(例如,强调和引用都具有公共超类 Inline)。要获得节点类层次结构的概述,请使用 epydoc(键入 epydoc nodes.py)并查看类层次结构树。” -- http://docutils.sourceforge.net/docs/dev/hacking.html

只找到整个文档中您需要的节点:),然后只写相关的节点

于 2013-07-26T15:47:47.283 回答