আমি কিছুটা আকর্ষণীয় পরিস্থিতিতে আছি যেখানে আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা তাত্ত্বিকভাবে বিভিন্ন পরিবেশের (এবং PATHs) এবং বিভিন্ন লিনাক্স সিস্টেমে বিভিন্ন ব্যবহারকারী দ্বারা চালিত হতে পারে। আমি চাই যে এই স্ক্রিপ্টটি কৃত্রিম সীমাবদ্ধতা ছাড়াই যথাসম্ভব এগুলির উপর কার্যকর করা হোক। এখানে কিছু পরিচিত সেটআপ রয়েছে:
- পাইথন ২.6 হ'ল সিস্টেম পাইথন সংস্করণ, সুতরাং পাইথন, পাইথন ২ এবং পাইথন ২..6 সবই / usr / bin (এবং সমতুল্য) -এ বিদ্যমান।
- পাইথন ২.6 হ'ল উপরে পাইথন সংস্করণ, তবে পাইথন ২.7 এটি পাইথন ২..7 হিসাবে ইনস্টল করা আছে।
- পাইথন ২.৪ হ'ল সিস্টেম পাইথন সংস্করণ, যা আমার স্ক্রিপ্ট সমর্থন করে না। / Usr / বিনে আমাদের কাছে পাইথন, পাইথন 2 এবং পাইথন 2.4 রয়েছে যা সমান এবং পাইথন 2.5 রয়েছে, যা স্ক্রিপ্ট সমর্থন করে।
আমি এই তিনটি ক্ষেত্রে একই এক্সিকিউটেবল অজগর স্ক্রিপ্টটি চালাতে চাই। এটি যদি প্রথমে /usr/bin/python2.7 ব্যবহার করার চেষ্টা করে তবে এটি খুব ভাল হবে /usr/bin/python2.6 এ ফিরে এসে /usr/bin/python2.5 এ পড়ে, যদি তাদের মধ্যে উপস্থিত না থাকে তবে কেবল ত্রুটিযুক্ত। আমি খুব সাম্প্রতিক ২.x ব্যবহার করে এটির সাথে ঝুলিয়ে নেই, যদিও যতক্ষণ না উপস্থিত উপস্থিত কেউ সঠিক দোভাষী খুঁজে পেতে সক্ষম হয়।
আমার প্রথম ঝোঁকটি ছিল শেবাং লাইনটি থেকে পরিবর্তন করা:
#!/usr/bin/python
প্রতি
#!/usr/bin/python2.[5-7]
যেহেতু এটি বাশ ভাল কাজ করে। তবে স্ক্রিপ্টটি চালনা দেয়:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
ঠিক আছে, তাই আমি নিম্নলিখিতগুলি চেষ্টা করে দেখি, যা ব্যাশে কাজ করে:
#!/bin/bash -c /usr/bin/python2.[5-7]
তবে আবার, এতে ব্যর্থ হয়:
/bin/bash: - : invalid option
ঠিক আছে, স্পষ্টতই আমি কেবল একটি পৃথক শেল স্ক্রিপ্ট লিখতে পারি যা সঠিক দোভাষীটি খুঁজে পায় এবং যে কোনও দোভাষী খুঁজে পাওয়া যায় না তা ব্যবহার করে পাইথন স্ক্রিপ্টটি চালায়। আমি সবেমাত্র দু'টি ফাইল বিতরণ করার ঝামেলা পেয়েছি যেখানে সর্বাধিক আপ টু ডেট অজগর 2 ইন্টারপ্রেটার ইনস্টল থাকা যতক্ষণ না এটি চালানো উচিত one লোককে স্পষ্টরূপে দোভাষী বলতে অনুরোধ করা (উদাহরণস্বরূপ $ python2.5 script.py
) কোনও বিকল্প নয়। কোনও নির্দিষ্ট উপায়ে সেটআপ করা ব্যবহারকারীর প্যাথের উপর নির্ভর করাও কোনও বিকল্প নয়।
সম্পাদনা:
পাইথন স্ক্রিপ্টের মধ্যে সংস্করণ পরীক্ষা করা কার্যকর হবে না যেহেতু আমি পাইথন ২.6 হিসাবে বিদ্যমান "উইথ" স্টেটমেন্টটি ব্যবহার করছি (এবং এর সাথে 2.5 ব্যবহার করা যেতে পারে from __future__ import with_statement
)। এটি স্ক্রিপ্টটি ব্যবহারকারী-বন্ধুত্বপূর্ণ সিন্ট্যাক্স এরিয়ারের সাথে সাথে সাথেই ব্যর্থ হয়ে যায় এবং আমাকে প্রথমে সংস্করণটি পরীক্ষা করার এবং উপযুক্ত ত্রুটি নির্গত করার সুযোগ থেকে বাধা দেয়।
উদাহরণ: (২.6 এর চেয়ে কম পাইথন ইন্টারপ্রেটার দিয়ে এটি ব্যবহার করে দেখুন)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
) এটি অজগর 2.4 সৃষ্টি করবে, যার ফলে আপনার কোডটি এটির ভুল সংস্করণ (এবং প্রস্থান ছাড়ুন) সম্ভবত এটি সনাক্ত করবে। তবে একটি পুরোপুরি ভাল পাইথন 2.5 রয়েছে যা পরিবর্তে দোভাষী হিসাবে ব্যবহার করা যেতে পারে!
exec
যদি তা হয় তবে অন্যথায় একটি ত্রুটি মুদ্রণ করুন।
execve
)। আর্গুমেন্টগুলি স্ট্রিং লিটারেল, কোনও গ্লোববিং, কোনও রেজেক্সপস নয়। এটাই. এমনকি প্রথম আর্গটি যদি "/ bin / bash" হয় এবং দ্বিতীয় বিকল্পগুলি ("-c ...") সেগুলি অপশন শেল দ্বারা বিশ্লেষণ করে না। এগুলি ব্যাশ এক্সিকিউটেবলের কাছে অপরিশোধিত হস্তান্তর করা হয়, এ কারণেই আপনি এই ত্রুটিগুলি পান। এছাড়াও, শেবাং কেবল তখনই কাজ করে যদি এটি শুরু হয়। সুতরাং আপনি এখানে ভাগ্যের বাইরে, আমি ভয় পাচ্ছি (এমন একটি স্ক্রিপ্টের সংক্ষিপ্ত যা অজগর দোভাষী খুঁজে পেয়েছে এবং এটিকে এখানে একটি ডক ফিড করেছে, যা ভয়াবহ জগাখিচুড়ি মনে হচ্ছে)।
import sys; sys.version_info()
ব্যবহারকারীর প্রয়োজনীয় অজগর সংস্করণ আছে কিনা তা পরীক্ষা করে দেখতে পারেন।