كيفية تنظيم وحدات Python لـ PYPI لدعم 2.x و 3.x
-
25-09-2019 - |
سؤال
لدي وحدة بيثون أود تحميلها إلى PYPI. حتى الآن ، فهي تعمل في Python 2.x. لا ينبغي أن يكون من الصعب جدًا كتابة إصدار لـ 3.x الآن.
ولكن بعد اتباع إرشادات لصنع الوحدات النمطية في هذه الأماكن:
ليس من الواضح بالنسبة لي كيفية دعم توزيعات المصدر المتعددة لإصدارات مختلفة من Python ، وليس من الواضح ما إذا كان/كيف يمكن لـ PYPI دعمها. أتصور أن لدي رمز منفصل لـ:
- 2.x
- 2.6 (ربما ، كحالة خاصة لاستخدام واجهة برمجة تطبيقات العازلة الجديدة)
- 3.x
كيف يمكن إعداد وحدة بيثون في PYPI حتى يتمكن شخص ما من القيام به:
easy_install modulename
وسيقوم بتثبيت الشيء الصحيح سواء كان المستخدم يستخدم 2.x أو 3.x؟
المحلول
لقد وجدت ذلك setup.py
ل httplib2
يبدو أن لديها طريقة أنيقة لدعم Python 2.x و 3.x. لذلك قررت نسخ هذه الطريقة.
المهمة هي صياغة واحدة setup.py
لتوزيع الحزمة الذي يعمل مع جميع توزيعات Python المدعومة. ثم مع نفس setup.py
, ، يمكنك ان تفعل:
python2 setup.py install
إلى جانب
python3 setup.py install
يجب أن يكون من الممكن الاحتفاظ به setup.py
بسيطة بما يكفي ليتم تحليلها مع جميع توزيعات بيثون المدعومة. لقد نجحت في ذلك مع حزمة cobs
الذي يدعم 2.4 إلى 2.6 وكذلك 3.1. تتضمن هذه الحزمة رمز Python النقي (رمز منفصل لـ Python 2.x و 3.x) و C ، مكتوبة بشكل منفصل لـ 2.x و 3.x.
للقيام بذلك:
1) أضع رمز Python 2.x في python2
الدليل الفرعي ، ورمز Python 3.x في أ python3
الدليل الفرعي.
2) أضع رمز التمديد C لـ 2.x و 3.x في أ src
دليل تحت python2
و python3
.
لذلك ، هيكل الدليل هو:
root
|
+--python2
| |
| +--src
|
+--python3
| |
| +--src
|
+--setup.py
+--MANIFEST.in
3) في setup.py
, ، كان لدي هذه الخطوط بالقرب من الأعلى:
if sys.version_info[0] == 2:
base_dir = 'python2'
elif sys.version_info[0] == 3:
base_dir = 'python3'
4) في الدعوة إلى setup
, ، لقد حددت الحزم كالمعتاد:
setup(
...
packages=[ 'cobs', 'cobs.cobs', 'cobs.cobsr', ],
5) حددت الدليل الأساسي لرمز Python باستخدام أ package_dir
الخيار (ارجع إلى الخطوة 3 ل base_dir
):
package_dir={
'cobs' : base_dir + '/cobs',
},
6) بالنسبة لتمديدات C ، أعطيت المسار:
ext_modules=[
Extension('cobs.cobs._cobs_ext', [ base_dir + '/src/_cobs_ext.c', ]),
Extension('cobs.cobsr._cobsr_ext', [ base_dir + '/src/_cobsr_ext.c', ]),
],
كان ذلك عن ذلك setup.py
. ال setup.py
الملف قابلاً للتشويش بواسطة كل من Python 2.x و 3.x.
7) أخيرًا ، إذا قمت بإنشاء توزيع مصدر باستخدام:
python2 setup.py sdist
بعد ذلك ، سوف يسحب بشكل افتراضي فقط الملفات اللازمة خصيصًا للبناء لهذا الثعبان. على سبيل المثال في الحالة أعلاه ، ستحصل فقط على الملفات python2
في توزيع المصدر ، ولكن ليس تلك تحت python3
. ولكن لتوزيع المصدر الكامل ، تريد تضمين الملفات لكل من 2.x و 3.x. للقيام بذلك ، قم بإنشاء أ MANIFEST.in
ملف يحتوي على شيء مثل هذا:
include *.txt
recursive-include python2 *
recursive-include python3 *
لمعرفة ما فعلته ، انظر cobs
رمز المصدر على Pypi أو Bitbucket.
نصائح أخرى
أبسط حل هو استخدام توزيع مصدر واحد.