سؤال

في بداية كل نصوص بايثون القابلة للتنفيذ، قمت بوضع ملف كوخ خط:

#!/usr/bin/env python

أقوم بتشغيل هذه البرامج النصية على نظام حيث env python ينتج بيئة بايثون 2.2.تفشل البرامج النصية الخاصة بي بسرعة لأن لدي فحصًا يدويًا لإصدار Python متوافق:

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

لا أريد أن أضطر إلى تغيير سطر shebang في كل ملف قابل للتنفيذ، إذا كان ذلك ممكنًا؛ومع ذلك، ليس لدي حق الوصول الإداري إلى الجهاز لتغيير النتيجة env python ولا أريد فرض إصدار معين، كما في:

#!/usr/bin/env python2.4

أرغب في تجنب ذلك لأن النظام قد يكون لديه إصدار أحدث من Python 2.4، أو قد يكون لديه Python 2.5 ولكن لا يوجد Python 2.4.

ما هو الحل الأنيق؟

[تحرير:] لم أكن محددًا بدرجة كافية في طرح السؤال - أود السماح للمستخدمين بتنفيذ البرامج النصية دون تكوين يدوي (على سبيل المثال،تغيير المسار أو الارتباط في ~/bin والتأكد من وجود PATH الخاص بك ~/bin قبل مسار بايثون 2.2).ربما تكون هناك حاجة إلى بعض أدوات التوزيع لمنع التعديلات اليدوية؟

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

المحلول

يقوم "env" ببساطة بتنفيذ أول ما يجده في PATH env var.للتبديل إلى لغة بايثون مختلفة، قم بإضافة الدليل الخاص بملف بايثون القابل للتنفيذ إلى المسار قبل استدعاء البرنامج النصي الخاص بك.

نصائح أخرى

حل مبتكر للغاية - إذا فشل الفحص، استخدم هذه الوظيفة (والتي ربما يمكن تحسينها بشكل كبير) لتحديد أفضل مترجم متاح، وتحديد ما إذا كان مقبولاً، وإذا كان الأمر كذلك، فأعد تشغيل البرنامج النصي الخاص بك باستخدام os.system أو شيء مشابه وsys. argv باستخدام المترجم الجديد.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

إذا كنت تقوم بتشغيل البرامج النصية، فيمكنك تعيين متغير PATH الخاص بك للإشارة إلى دليل سلة خاص أولاً:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

ثم عند تنفيذ البرنامج النصي python الخاص بك، فإنه سيستخدم python 2.4.سيتعين عليك تغيير البرامج النصية لتسجيل الدخول لتغيير PATH الخاص بك.

بدلاً من ذلك، قم بتشغيل برنامج python النصي الخاص بك باستخدام المترجم الصريح الذي تريده:

$ /path/to/python2.4 <your script>

@مورايس:هذه فكرة مثيرة للاهتمام، ولكن أعتقد أنه ربما يمكننا أن نأخذها خطوة أخرى إلى الأمام.ربما هناك طريقة للاستخدام إيان بيكينج Virtualenv ل:

  • لنرى ما إذا كنا نعمل في بيئة مقبولة للبدء بها، وإذا كان الأمر كذلك، فلا نفعل شيئًا.
  • تحقق مما إذا كان هناك ملف قابل للتنفيذ خاص بالإصدار على ملف PATH, ، أي.تحقق فيما لو python2.x موجود for x in reverse(range(4, 10)).إذا كان الأمر كذلك، أعد تشغيل الأمر باستخدام المترجم الأفضل.
  • في حالة عدم وجود مترجم أفضل، استخدم virtualenv لمحاولة تثبيت إصدار أحدث من Python من الإصدار الأقدم من Python والحصول على أي حزم متطلبات مسبقة.

ليس لدي أي فكرة عما إذا كان Virtualenv قادرًا على القيام بذلك، لذا سأتعامل معه في وقت ما قريبًا.:)

إليك الحل إذا كنت (1) مستعدًا تمامًا لاستخدام shebangs و(2) قادرًا على استخدام Autotools في عملية الإنشاء.

لقد اكتشفت الليلة الماضية أنه يمكنك استخدام ماكرو autoconf AM_PATH_PYTHON للعثور على الحد الأدنى من بايثون 2 الثنائية.الطريقة هي هنا.

لذلك، ستكون عمليتك:

  • إصدار AM_PATH_PYTHON(2.4) في الخاص بك configure.ac
  • إعادة تسمية كل ما تبذلونه من .py البرامج النصية ل .py.in (في تجربتي، هذا لا يخلط vi)
  • قم بتسمية جميع نصوص Python التي تريد إنشاءها باستخدامها AC_CONFIG_FILES.
  • بدلاً من البدء بـ #!/usr/bin/env python, ، يستخدم #!@PYTHON@

ثم الخاص بك الناتجة ستحتوي نصوص بايثون دائمًا على Shebang المناسب.

إذن، أمامك هذا الحل، على الأقل ممكن، إن لم يكن عملياً.

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