سؤال

لدي وحدة بيثون أود تحميلها إلى 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.

نصائح أخرى

أبسط حل هو استخدام توزيع مصدر واحد.

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