ما هي الطريقة الصحيحة لاستخدام البيانات الوصفية Unicode في Setup.py؟

StackOverflow https://stackoverflow.com/questions/1162338

  •  18-09-2019
  •  | 
  •  

سؤال

كنت أكتب Setup.py للحصول على حزمة بيثون باستخدام Setuptools وأرادت تضمين حرف غير ASCII في حقل Long_Description:

#!/usr/bin/env python
from setuptools import setup
setup(...
      long_description=u"...", # in real code this value is read from a text file
      ...)

لسوء الحظ، فإن تمرير كائن Unicode إلى الإعداد () يكسر أي من الأوامر التالية التالية مع UnicodeEncodeError

Python Setup.py - Long-Description | RST2HTML Python Setup.py تحميل

إذا كنت تستخدم سلسلة UTF-8 RAWOR لحقل Long_Description، فسيسر الأمر التالي باستخدام UnicodeCodeError:

python setup.py التسجيل

أعرض عموما إصدار البرامج عن طريق تشغيل تحميل "Python Setup.py SDist"، مما يعني الخارقة القبيحة التي تنظر إلى sys.argv وتمرير نوع الكائن المناسب موجود.

في النهاية استسلمت وتنفيذ اختراق قبيح مختلف:

class UltraMagicString(object):
    # Catch-22:
    # - if I return Unicode, python setup.py --long-description as well
    #   as python setup.py upload fail with a UnicodeEncodeError
    # - if I return UTF-8 string, python setup.py sdist register
    #   fails with an UnicodeDecodeError

    def __init__(self, value):
        self.value = value

    def __str__(self):
        return self.value

    def __unicode__(self):
        return self.value.decode('UTF-8')

    def __add__(self, other):
        return UltraMagicString(self.value + str(other))

    def split(self, *args, **kw):
        return self.value.split(*args, **kw)

...

setup(...
      long_description=UltraMagicString("..."),
      ...)

ليست هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

من الواضح أن هناك خطأ في Distutils تم إصلاحه في Python 2.6: http:/mail.python.org/pipermail/distutils-sig/2009-September/013275.html.

Tarek يقترح التصحيح post_to_server. يجب أن يقوم التصحيح بمعالجة جميع القيم مسبقا في وسيطة "البيانات" وتحويلها إلى Unicode ثم استدعاء الطريقة الأصلية. يرى http://mail.python.org/pipermail/distutils-sig/2009-September/013277.html.

نصائح أخرى

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup
setup(name="fudz",
      description="fudzily",
      version="0.1",
      long_description=u"bläh bläh".encode("UTF-8"), # in real code this value is read from a text file
      py_modules=["fudz"],
      author="David Fraser",
      author_email="davidf@sjsoft.com",
      url="http://en.wikipedia.org/wiki/Fudz",
      )

أنا اختبار مع الرمز أعلاه - لا يوجد خطأ من - Long-description، فقط من RST2HTML؛ يبدو أن التحميل يعمل في العمل بشكل جيد (على الرغم من أنني ألغي التحميل في الواقع) والتسجيل يسألني عن اسم المستخدم الذي ليس لدي. لكن Traceback في تعليقك مفيد - إنه التحويل التلقائي unicode في ال register الأمر الذي يسبب المشكلة.

يرى setdefaultencoding المنوال لمزيد من المعلومات حول هذا - كنت تريد أساسا الترميز الافتراضي في Python لتكون قادرا على تحويل السلسلة المشفرة إلى Unicode، ولكن من الصعب ضبط هذا الأمر. في هذه الحالة أعتقد أنه يستحق الجهد:

import sys
reload(sys).setdefaultencoding("UTF-8")

أو حتى أن تكون صحيحة يمكنك الحصول عليها من locale - يوجد رمز معلق في /usr/lib/python2.6/site.py يمكنك أن تجد هذا يفعل هذا ولكن سأترك هذه المناقشة الآن.

تحتاج إلى تغيير وصف Unicode الخاص بك u"bläh bläh bläh" إلى سلسلة عادية "bläh bläh bläh" وإضافة رأس ترميز كطريق ثاني لملفك:

#!/usr/bin/env python
# encoding: utf-8
...
...

من الواضح أنك تحتاج إلى حفظ الملف مع ترميز UTF-8، أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top