Как заставить работать описание PyPi Markdown?
Я загрузил пакет в PyPi, используя:
python setup.py register -r pypi
python setup.py sdist upload -r pypi
Я пытаюсь изменить описание, которое я написал (пожалуйста, не редактируйте форматирование следующего фрагмента кода, я сделал это специально для демонстрации своей проблемы):
**my plugin**
This plugin enables you to ... For example:
'''python
@attr(section='MySection', id=1)
def test_function(self):
"""
Bla bla bla
"""
pass
'''
Тем не менее, текст отображается как есть, без форматирования уценки. Что я делаю неправильно?
Ответы
Ответ 1
С 16 марта 2018 года PyPI.org или Warehouse (наконец-то) поддерживает Markdown в длинных описаниях. Склад заменил старое устаревшее внедрение 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 upload dist/*
Старая устаревшая инфраструктура PyPI не отображает Markdown, а только новая инфраструктура Warehouse. Устаревшая инфраструктура в настоящее время исчезла (по состоянию на 2018-04-30).
В настоящее время PyPI использует cmarkgfm
качестве средства визуализации readme_renderer
через библиотеку readme_renderer
(используя readme_renderer.markdown.render(long_description)
для создания вывода в формате HTML). Это означает, что ваши документы уценки будут отображаться точно так же, как на GitHub; это по сути тот же рендер.
Вы можете проверить ваш пакет long_description
с помощью команды twine check
twine
(twine
1.12.0 или новее).
Старый ответ <2018-03-16 следует ниже.
Примечание: это старый, ныне устаревший ответ, по состоянию на 2018-03-16 поддерживается уценка при условии, что вы используете правильные инструменты, см. Выше.
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.
Ваш блок кода использует расширения Github Markdown, которые совершенно не подходят для reStructuredText. Вы можете использовать блок кода reST (возможно, если Python-версия Docutils достаточно новая):
.. code-block:: python
@attr(section='MySection', type='functional+', module='MyModule', id=1)
def test_function(self):
"""
This is the original docstring
"""
pass
Чтобы проверить это локально, вам также нужно установить Pygments.
Если вам интересно, есть функция запроса с запросом на добавление для добавления поддержки Markdown.
Ответ 2
Как указано @Martijn Pieters
, PyPi не поддерживает Markdown. Я не уверен, где я узнал следующий трюк, но вы можете использовать Pandoc и PyPandoc, чтобы преобразовать ваши файлы Markdown в RestructuredText перед загрузкой в PyPi. Для этого добавьте в файл setup.py
следующее:
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, я использовал Homebrew:
brew install pandoc
Чтобы установить PyPandoc, я использовал pip:
pip install pypandoc
Ответ 3
PyPI поддерживает первую, а не уценку, как упоминалось в других ответах. Но вам не нужно pypandoc
perse, просто pandoc
в порядке. Сначала вы можете сначала создать первый файл локально, а затем запустить setup.py для загрузки пакета.
upload.sh
:
#!/bin/bash
pandoc --from=markdown --to=rst --output=README README.md
python setup.py sdist upload
Сгенерированный файл с именем README
будет автоматически распознан. Не забудьте добавить его в свой .gitignore
! 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.
Ответ 4
У меня были проблемы с символами \r
, вызывающими проблемы с синтаксическим разбором, когда в pypi появляется только первая строка README. В приведенном ниже коде устранена проблема, она поступает из репозитория модуля 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
script.
Ответ 5
Есть хороший пакет для папок, который работал у меня
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.test позже
https://github.com/pablodav/burp_server_reports/blob/master/burp_reports/lib/check_readme.py
Ответ 6
Вы также можете установить уценку в файле setup.cfg
:
[metadata]
...
description-file = README.md
long-description-content-type = text/markdown
Оформите мой проект в качестве примера: на github и на pypi.