ما هي الطريقة الصحيحة لاستخدام البيانات الوصفية Unicode في Setup.py؟
-
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، أيضا.