Описание PyPI markdown не работает

Я загрузил пакет в PyPi, используя:

python setup.py register -r pypi
python setup.py sdist upload -r pypi

Я пытаюсь изменить описание, я написал (Пожалуйста, не редактируйте форматирование следующего фрагмента кода, я сделал это с целью продемонстрировать свою проблему):

**nose-docstring-plugin**

This plugin enables you to modify docstring of tests based on their attributes, for example:
```python
@attr(section='MySection', type='functional+', module='MyModule', id=1)
def test_function(self):
    """
    This is the original docstring
    """
    pass
```

однако текст выглядит так, как есть,без форматирование markdown. Что я делаю не так?

6 ответов


по состоянию на 16 марта 2018 года, PyPI.org aka Warehouse (наконец) поддерживает уценку в длинных описаниях. Склад заменил старую устаревшую реализацию PyPI в апреле 2018 года.

вам нужно:

  • убедится setuptools обновлен до версии 38.6.0 или новее

  • убедится twine обновлен до версии 1.11.0 или новее

  • убедитесь, что wheel обновлен до версии 0.31.0 или новее

  • добавить новое поле с именем long_description_content_type на setup() вызовите и установите его в 'text/markdown':

    setup(
        long_description="""# Markdown supported!\n\n* Cheer\n* Celebrate\n""",
        long_description_content_type='text/markdown',
        # ....
    )
    

    посмотреть PEP 566 -метаданные для программных пакетов Python 2.1.

  • использовать twine чтобы загрузить свои дистрибутивы в PyPI:

    $ python setup.py sdist bdist_wheel   # adjust as needed
    $ twine update dist/*
    

старая устаревшая инфраструктура PyPI не будет отображаться Markdown, только новая инфраструктура склада делает. Наследие инфраструктуры не стало (как в 2018-04-30).

в настоящее время PyPI использует cmarkgfm как визуализатор markdown, через readme_renderer библиотека (через readme_renderer.markdown.render(long_description) для получения вывода HTML). Это означает, что ваши документы markdown будут отображать точно так же как и на GitHub; это по существу тот же рендерер.

старый


Примечание: это старый, теперь устаревший ответ, по состоянию на 2018-03-16 Markdown поддерживается при условии, что вы используете правильные инструменты, см. выше.

PyPI делает не поддержка Markdown, поэтому ваш README не будет отображаться в HTML.

если вы хотите визуализированный README, придерживайтесь reStructuredText;введение Сфинкса в reStructuredText - хорошее начало точка.

вы, вероятно, хотите установить docutils пакета таким образом, вы можете проверить свой документ локально; вы хотите запустить включенный rst2html.py скрипт на вашем README, чтобы увидеть, какие ошибки производятся, если таковые имеются. В вашем конкретном примере слишком много ошибок:

$ bin/rst2html.py test.rst  > /tmp/test.html
test.rst:7: (ERROR/3) Unexpected indentation.
test.rst:3: (WARNING/2) Inline literal start-string without end-string.
test.rst:3: (WARNING/2) Inline interpreted text or phrase reference start-string without end-string.
test.rst:11: (WARNING/2) Block quote ends without a blank line; unexpected unindent.
test.rst:11: (WARNING/2) Inline literal start-string without end-string.
test.rst:11: (WARNING/2) Inline interpreted text or phrase reference start-string without end-string.

ваш блок кода использует расширения Markdown Github, которые полностью неверны для reStructuredText. Вы можете использовать блок кода reST (возможно, если версия PyPI docutils является новой достаточно):

.. code-block:: python

    @attr(section='MySection', type='functional+', module='MyModule', id=1)
    def test_function(self):
        """
        This is the original docstring
        """
        pass

чтобы проверить это локально, вам необходимо установить одном как хорошо.

есть запрос функции с запросом pull чтобы добавить поддержку Markdown, если вы заинтересованы.


As @Martijn Pieters указано, PyPi не поддерживает Markdown. Я не уверен, где я узнал следующий трюк, но вы можете использовать Pandoc и PyPandoc для преобразования файлов Markdown в RestructuredText перед загрузкой в PyPi. Для этого добавьте в свой :

try:
    import pypandoc
    long_description = pypandoc.convert('README.md', 'rst')
except(IOError, ImportError):
    long_description = open('README.md').read()

setup(
    name='blah',
    version=find_version('blah.py'),
    description='Short description',
    long_description=long_description,
)

установить Pandoc на OS X, я использовал доморощенного:

brew install pandoc

установить PyPandoc, Я Пип:

pip install pypandoc

PyPI поддерживает rst, а не markdown, как упоминалось в других ответах. Но вам не нужно pypandoc перс, просто pandoc - это хорошо. Вы можете сначала создать первый файл локально, а затем запустить setup.py чтобы загрузить пакет.

upload.sh:

#!/bin/bash
pandoc --from=markdown --to=rst --output=README README.md
python setup.py sdist upload

сгенерированный файл с именем README будет автоматически распознан. Обязательно добавьте его в свой .gitignore! The setup.py ничего не нужно делать специальный.

setup.py:

from distutils.core import setup

setup(
    name='mypackage',
    packages=['mypackage'],  # this must be the same as the name above
    version='0.2.8',
    description='short',
    author='Chiel ten Brinke',
    author_email='<email>',
    url='<github url>',  # use the URL to the github repo
    keywords=[],  # arbitrary keywords
    classifiers=[],
)

тогда просто запустите bash upload.sh чтобы загрузить материал в PyPI.


у меня были проблемы с \r символы, вызывающие проблемы синтаксического анализа, где только первая строка README появляется в pypi. Код ниже устраняет проблему, он исходит из pypandoc репозитории модуля:

try:
    long_description = pypandoc.convert('README.md', 'rst')
    long_description = long_description.replace("\r","") # Do not forget this line
except OSError:
    print("Pandoc not found. Long_description conversion failure.")
    import io
    # pandoc is not installed, fallback to using raw contents
    with io.open('README.md', encoding="utf-8") as f:
        long_description = f.read()

таким образом long_description содержит дезинфицированную версию вашего Readme, и вы можете передать его в функцию setup () в вашем setup.py сценарий.


есть хороший пакет pip, который работал для меня

https://pypi.python.org/pypi/restructuredtext_lint/

Я использую его в своей настройке сейчас:

https://github.com/pablodav/burp_server_reports/blob/master/setup.py

def check_readme(file='README.rst'):
"""
Checks readme rst file, to ensure it will upload to pypi and be formatted correctly.
:param file:
:return:
"""
errors = rst_lint.lint_file(file)
if errors:
    msg = 'There are errors in {}, errors \n {}'.format(file, errors[0].message)
    raise SystemExit(msg)
else:
    msg = 'No errors in {}'.format(file)
print(msg)

также я создал lib, чтобы иметь возможность использовать в py.тест позже

https://github.com/pablodav/burp_server_reports/blob/master/burp_reports/lib/check_readme.py

выполнить эти три команды и он будет работать

pip install --upgrade setuptools
pip install --upgrade twine
pip install --upgrade wheel