আমি # করা উচিত! পাইথন স্ক্রিপ্টগুলিতে (শেবাং), এবং এটির কোন রূপ নেওয়া উচিত?


827

আমার পাইথন স্ক্রিপ্টগুলিতে কি শেবাং লাগানো উচিত? কোন রূপে?

#!/usr/bin/env python 

অথবা

#!/usr/local/bin/python

এগুলি কি সমানভাবে বহনযোগ্য? কোন রূপটি সবচেয়ে বেশি ব্যবহৃত হয়?

দ্রষ্টব্য: টর্নেডো প্রকল্পের কুঁড়েঘর ব্যবহার করে। অন্যদিকে জ্যাঙ্গো প্রকল্পটি তা করে না।


70
দ্বিতীয়টি বহনযোগ্য নয় এবং বেশিরভাগ কম্পিউটারে ব্যর্থ হবে
ডায়েটরিচ এপ্প

4
#!/usr/bin/pythonপ্রথম বিকল্পের সাথে কীভাবে তুলনা করা যায়? আমি এটি বেশ কয়েকটি উদাহরণ কোডে দেখছি। সম্পাদনা: হয়তো এই উত্তর .. stackoverflow.com/a/2429517/1156245
geotheory


1
আমি বলি সর্বদা এটি ব্যবহার করুন, কেন? "পাইথনের জেন অফ জেন" - লাইন 2 - "স্পষ্ট বর্ণিত চেয়ে ভাল।" পাইথন.অর্গ
দেবদেবী /

2
স্পষ্টতই, উভয়ই "সঠিক" নয়, কারণ স্ক্রিপ্টটি চালিত হলে পাইথনের সঠিক সংস্করণটি কোথায় হবে তা লেখক হিসাবে আপনি জানেন না। সঠিক শেবাং যুক্ত করা ইনস্টলারের কাজ হওয়া উচিত ।
চিপনার

উত্তর:


1116

যে কোনও স্ক্রিপ্টের শেবাং লাইনটি স্ক্রিপ্টটির নির্ধারণের জন্য pythonটার্মিনালে আগে টাইপ না করে বা ফাইল ম্যানেজারে ডাবল ক্লিক করার পরে (যখন সঠিকভাবে কনফিগার করা থাকে) নির্ধারণযোগ্য স্ট্যান্ডেলোনের মতো সম্পাদন করার ক্ষমতা নির্ধারণ করে । এটি প্রয়োজনীয় নয় তবে সাধারণত সেখানে রাখা হয় যখন যখন কেউ এডিটরটিতে ফাইলটি খোলার দেখতে পায় তখন তারা তাত্ক্ষণিকভাবে জানতে পারে যে তারা কী দেখছে। তবে আপনি কোন শেবাং লাইনটি আইএস গুরুত্বপূর্ণ তা ব্যবহার করেন ।

পাইথন 3 স্ক্রিপ্টগুলির সঠিক ব্যবহার হ'ল:

#!/usr/bin/env python3

এটি সংস্করণ 3. স্তরে ডিফল্ট। পাইথনের জন্য 2.7 . python2স্থানে ব্যবহার করুন python3

নিম্নলিখিতটি ব্যবহার করা উচিত নয় (বিরল ক্ষেত্রে ব্যতীত যে আপনি কোডটি লিখছেন যা পাইথন 2.x এবং 3.x উভয়ের সাথে সামঞ্জস্যপূর্ণ):

#!/usr/bin/env python

PEP 394-এ দেওয়া এই প্রস্তাবগুলির কারণটি হ'ল এটি pythonহয় বিভিন্ন সিস্টেমে python2বা python3on এটি বর্তমানে python2বেশিরভাগ বিতরণকে বোঝায় , তবে এটি কোনও পর্যায়ে পরিবর্তিত হতে পারে।

এছাড়াও, ব্যবহার করবেন না:

#!/usr/local/bin/python

"সেই ক্ষেত্রে পাইথন / usr / bin / পাইথন বা / বিন / পাইথন ইনস্টল করা যেতে পারে, উপরের #! ব্যর্থ হবে।"

- "#! / usr / bin / env পাইথন" বনাম "#! / usr / স্থানীয় / বিন / পাইথন"


4
@ ইলিয়াসভ্যানঅটেজেম যদি আপনি নিশ্চিত না করতে পারেন যে অজগরটি পাওয়া /usr/binযাবে তবে আপনি কীভাবে নিশ্চিত হবেন যে envএটি পাওয়া যাবে /usr/bin। যদি পাইথনটি একটি মানহীন স্থানে ইনস্টল করা থাকে তবে এর সম্ভবত অর্থ হ'ল পাইথনটি একটি মানহীন উপায়ে সেটআপ করা হয়েছে এবং ফলস্বরূপ স্ক্রিপ্টটি দ্রুত ব্যর্থ হওয়া উচিত। অজগর দোভাষীর সম্পত্তি সম্পর্কে অনুমান করা এবং সর্বোত্তম আশা করার বিরোধিতা হিসাবে।
ডুনস

65
@Dunes: envহবে সবসময় পাওয়া যাবে /usr/bin/, এবং তার কাজ (পাইথন মত) বিন খোজা ব্যবহার করছে PATH। অজগরটি কীভাবে ইনস্টল করা হয়, তার পথটি এই চলকটিতে যুক্ত envহবে এবং এটি খুঁজে পাবে (যদি তা না হয় তবে পাইথন ইনস্টল করা নেই)। যে কাজ env, সমগ্র যে কারণে কেন এটা বিদ্যমান। এটি সেই জিনিসটি যা পরিবেশকে সতর্ক করে দেয় (ইনস্টলাল পাথ সহ এনভ ভেরিয়েবলগুলি সেটআপ করে, এবং পাথগুলি অন্তর্ভুক্ত করে)। লোকেরা সর্বদা বুঝতে পেরেছিল যে এই আদেশটি কেবল একই জায়গায় পাওয়া গেলে কেবল সেই কাজ করতে পারে। এটি কেবল একটি দেওয়া
এলিয়াস ভ্যান ওটেজেম

3
@ জেফাসেবাস্টিয়ান: আপনি ঠিক বলেছেন, এটি গ্যারান্টিযুক্ত নয়, বা পসিক্স স্ট্যান্ডার্ড দ্বারা প্রয়োগ করা হয়েছে। আমি ধরে নিয়েছিলাম কারণ এটির একটি আইইইই সংস্করণে কিছু পরিবেশগত উপাদান রয়েছে। যে কোনও উপায়ে: না, /usr/bin/envকোনও মানদণ্ডের দ্বারা গ্যারান্টিযুক্ত নয়, বিস্তৃত (সর্বজনীন?) গৃহীত
বিধিবিধান ব্যতীত

6
আপনি যদি ভ্যুচুয়ালেনভ ব্যবহার করে থাকেন তবে #! / Usr / স্থানীয় / বিন / পাইথন এমনকি এটি উপস্থিত থাকলেও ভুল হয়ে যায়।
নুলাস

6
এই সঙ্গে একটা সমস্যা: অনুযায়ী PEP394 শুধু ব্যবহার করা উচিত pythonএক্সিকিউটেবল যখন স্ক্রিপ্ট পাইথন 2 এবং পাইথন 3. অন্যথা সঙ্গে সামঞ্জস্যপূর্ণ, তা থেকে উপযুক্ত পছন্দ নির্দেশ করা উচিত python2এবং python3
amiller27

67

এটি সত্যিই কেবল স্বাদের বিষয়। শেবাং যুক্ত করার অর্থ লোকেরা চাইলে সরাসরি স্ক্রিপ্টটি আহ্বান করতে পারে (ধরে নিলে এটি নির্বাহযোগ্য হিসাবে চিহ্নিত হয়েছে); এটিকে বাদ দেওয়ার অর্থ হ'ল pythonম্যানুয়ালি আহ্বান জানাতে হবে।

প্রোগ্রামটি চালানোর শেষ ফলাফলটি কোনওভাবেই প্রভাবিত হয় না; এটি কেবলমাত্র উপায়গুলির বিকল্প।


3
এটি ঠিক - এটি কোনও দিকই নয় যে আপনি কোন দিকে যাবেন কারণ কোনও "ডান" দিক নেই। এটি সম্পূর্ণ বিষয়গত সিদ্ধান্ত
অ্যাম্বার

5
অন্য কোন তুচ্ছ সিদ্ধান্তের চেয়ে বেশি কিছু নয়। en.wikipedia.org/wiki/Parkinson's_Law_of_Triviality
অ্যাম্বার

2
'পাইথন' কমান্ড ছাড়াই আমি কীভাবে একটি অজগর ফাইলটি কার্যকর করতে পারি?
জেন

5
@ জেন ধরে নিলেন যে আপনি আপনার স্ক্রিপ্টে শেবাং (#! / Usr / bin / env পাইথন) অন্তর্ভুক্ত করেছেন আপনার স্ক্রিপ্টটি কার্যকর হতে হবে to এর মতো কিছু chmod a+x [your-script].pyএটি কার্যকর করা উচিত এবং তারপরে আপনি কেবল ./[your-script.py]শেলটিতে কল করতে পারেন ।
skålfyfan

9
GlassGhost দ্বারা উত্তর একটা বিষয় চিহ্নিত করেছে, সেখানে হয় একটি কংক্রিট সুবিধা স্বাদ ছাড়াও এটা সহ: এটা ফাইলের ভবিষ্যতে পাঠক স্পষ্ট করে তোলে যে, তারা একটি এক্সিকিউটেবল স্ক্রিপ্ট পড়ি, বরং একটি ফাইল যে আমদানি করা বোঝানো হচ্ছে বেশী। একইভাবে যে ভাষাগুলি রয়েছে তাদের সরকারী / বেসরকারী অ্যাক্সেস নিয়ন্ত্রণ সংশোধকগুলির ক্ষেত্রে, শেবাংগুলি ডকুমেন্টেশন হিসাবে তাদের প্রকৃত প্রভাবের জন্য দরকারী এবং কিছু ক্ষেত্রে ডকুমেন্টেশন দিকটি আসলে সবচেয়ে গুরুত্বপূর্ণ।
মার্ক আমেরিকা

32

আমার পাইথন স্ক্রিপ্টগুলিতে কি শেবাং লাগানো উচিত?

পাইথন স্ক্রিপ্টে একটি শেবাং রাখুন যাতে তা নির্দেশিত হয়:

  • এই মডিউলটি স্ক্রিপ্ট হিসাবে চালানো যেতে পারে
  • এটি কেবল পাইথন 2, পাইথন 3 এ চালানো যেতে পারে বা পাইথন 2/3 সামঞ্জস্যপূর্ণ
  • পজিক্সে, যদি আপনি pythonএক্সিকিউটেবলকে স্পষ্টভাবে আমন্ত্রণ না করে সরাসরি স্ক্রিপ্টটি চালাতে চান তবে এটি প্রয়োজনীয়

এগুলি কি সমানভাবে বহনযোগ্য? কোন রূপটি সবচেয়ে বেশি ব্যবহৃত হয়?

যদি আপনি নিজে শেবাং লিখেন #!/usr/bin/env pythonতবে আপনার ব্যবহার না করার নির্দিষ্ট কারণ না থাকলে সর্বদা ব্যবহার করুন । এই ফর্মটি উইন্ডোজ (পাইথন লঞ্চার) তেও বোঝা যায়।

দ্রষ্টব্য: ইনস্টল করা স্ক্রিপ্টগুলিতে একটি নির্দিষ্ট পাইথন এক্সিকিউটেবল যেমন, /usr/bin/pythonবা ব্যবহার করা উচিত /home/me/.virtualenvs/project/bin/python। যদি আপনার শেলটিতে কোনও ভার্চুয়ালেনভ সক্রিয় করা হয় তবে কোনও সরঞ্জাম ব্রেক হয়ে গেলে এটি খারাপ। ভাগ্যক্রমে, সঠিক শেবাং বেশিরভাগ ক্ষেত্রে স্বয়ংক্রিয়ভাবে তৈরি হয় setuptoolsবা আপনার বিতরণ প্যাকেজ সরঞ্জামগুলি (উইন্ডোজে, স্বয়ংক্রিয়ভাবে setuptoolsমোড়কের .exeস্ক্রিপ্টগুলি তৈরি করতে পারে )।

অন্য কথায়, স্ক্রিপ্টটি যদি সোর্স চেকআউটে থাকে তবে আপনি সম্ভবত দেখতে পাবেন #!/usr/bin/env python। যদি এটি ইনস্টল করা থাকে তবে শেবাংটি একটি নির্দিষ্ট অজগরকে কার্যকর করার যোগ্য একটি পথ যেমন #!/usr/local/bin/python (দ্রষ্টব্য: আপনি পরবর্তী বিভাগ থেকে ম্যানুয়ালি পাথগুলি লিখবেন না)।

আপনার ব্যবহার করা উচিত , বা শেবাং-এ ব্যবহার করা উচিত তা চয়ন করতে python, পিইপি 394 - ইউনিক্স-লাইক সিস্টেমে "পাইথন" কমান্ডটি দেখুন :python2python3

  • ... pythonকেবলমাত্র স্ক্রিপ্টগুলির জন্য শেবাং লাইনে ব্যবহার করা উচিত যা পাইথন 2 এবং 3 উভয়ের সাথেই সুসংগত।

  • পাইথনের ডিফল্ট সংস্করণে পরিণামের পরিবর্তনের জন্য, পাইথন 2 কেবলমাত্র স্ক্রিপ্টগুলিকে পাইথন 3 এর সাথে সুসংগত হতে অন্যথায় python2শেবাং লাইনে ব্যবহার করতে আপডেট করা উচিত ।


3
এমনকি একটি পিইপি উল্লেখ করার জন্য প্রথম উত্তরের পর্যাপ্ত পরিমাণ নেই। তাই না? #!/usr/bin/env pythonনিজের জন্য কি পিইপি আছে ?
বিনিকি

দয়া করে ব্যবহার করবেন না #!/usr/bin/env python। দয়া করে "সর্বদা ব্যবহার" করার পরামর্শ দিবেন না #!/usr/bin/env python। 99% ক্ষেত্রে এটি করা ভুল জিনিস (আপনি নিজের উত্তরের সাথে যুক্ত করেছেন)।
জে সুলিভান

1
@ জয়সুলিভান আপনি কি উত্স চেকআউট এবং ইনস্টল করা স্ক্রিপ্টগুলির মধ্যে পার্থক্য বুঝতে পেরেছেন? আমি এই পরামর্শ পিছনে দাঁড়িয়ে। এটি ভালই কাজ করে.
jfs

1
@ জেফএস: আমার মন্তব্যটি পুনরায় পড়ার পরে আমি দেখতে পাচ্ছি যে আমি কীভাবে আমার বক্তব্যটি পুরোপুরি পেতে ব্যর্থ হয়েছি। আমার অর্থ হ'ল বেশিরভাগ লোক 'পাইথন 2' বা 'পাইথন 3' ব্যবহার করতে চাইবে। পুরো পথ বা এনভিভির মাধ্যমে সমাধান করা বা না করা, যা প্রযুক্তিগতভাবে ওপি প্রশ্ন ছিল, আপনি উত্তর দিয়েছেন এবং আমি এই বিষয়ে একমত নই।
জে সুলিভান

@ জয়সুলিভান আমি একমত আপনি উত্তরের পিপ থেকে উদ্ধৃতিটি পড়েছেন? এটি একই জিনিস বলে।
jfs

15

যদি আপনার কাছে পাইথনের একাধিক সংস্করণ থাকে এবং স্ক্রিপ্টটি একটি নির্দিষ্ট সংস্করণের অধীনে চালিত হয় তবে শি-ব্যাং নিশ্চিত করতে পারে যে স্ক্রিপ্টটি সরাসরি সম্পাদন করা হলে ডানটি ব্যবহার করা হবে, উদাহরণস্বরূপ:

#!/usr/bin/python2.7

নোট করুন স্ক্রিপ্টটি এখনও একটি সম্পূর্ণ পাইথন কমান্ড লাইনের মাধ্যমে বা আমদানির মাধ্যমে চালানো যেতে পারে, সে ক্ষেত্রে শে-ব্যাং উপেক্ষা করা হয়। তবে স্ক্রিপ্টগুলি সরাসরি চালিত হওয়ার জন্য, শি-ব্যাং ব্যবহারের এটি শালীন কারণ।

#!/usr/bin/env python সাধারণত ভাল পদ্ধতির হয়, তবে এটি বিশেষ ক্ষেত্রে সহায়তা করে।

সাধারণত পাইথনের ভার্চুয়াল পরিবেশ স্থাপন করা ভাল, এই ক্ষেত্রে জেনেরিকটি ভার্চুয়ালেনভের #!/usr/bin/env pythonজন্য পাইথনের সঠিক উদাহরণটি সনাক্ত করতে পারে।


স্থান কি এটি ব্যর্থ হতে চলেছে না?
এলোমেলো ইনসানো

1
@ র্যান্ডম আইসানসো, আমি এটি মনে করি না। স্পেসগুলি বেশ সাধারণ বলে মনে হচ্ছে এবং এটি গ্রহণযোগ্য ব্যবহার হিসাবে এর জালের চারপাশে প্রচুর প্রমাণ রয়েছে। তবে আমি মনে করি যে কোনও স্থানই সম্ভবত ব্যবহারিক তত বেশি ব্যবহারযোগ্য।
ক্রিস জনসন

1
আপনি অবশ্যই এই এক। সবেমাত্র bash এবং tcsh এ পরীক্ষা করা হয়েছে।
এলোমেলো ইনসানো 30'14

এর ফলাফলগুলি whichআপনাকে একটি স্ট্রিং দেবে যা সময়ের সাথে সাথে কাজ করবে। এটি ব্যবহার করার জন্য আপনার কোনও সাহসের বিষয়ে চিন্তা করার দরকার নেই।
এসডসোলার

10

যদি স্ক্রিপ্টটি কার্যকর করার উদ্দেশ্যে হয় তবে আপনার একটি শেবাং যুক্ত করা উচিত। আপনার ইনস্টলিং সফ্টওয়্যার সহ স্ক্রিপ্টটিও ইনস্টল করা উচিত যা শেবাংকে সঠিক কিছুতে সংশোধন করে যাতে এটি লক্ষ্য প্ল্যাটফর্মে কাজ করবে। এর উদাহরণগুলি হ'ল ডিস্টুয়েলস এবং বিতরণ।


1
আপনাকে # সংশোধন করতে হবে না! পরে লাইন। এটিই / usr / bin / env এর জন্য। নির্দিষ্ট পাইথন ইন্টারপ্রেটারের বিরুদ্ধে হার্ড-কোডিং ভালোর চেয়ে বেশি ক্ষতি করতে পারে। এটি অন্য পাইথন সংস্করণ ইনস্টল করা বা আমাদের ডিস্ট্রোর পাইথন বনাম একটি কাস্টম পাইথন ইনস্টলেশন সম্পর্কিত খুব ভঙ্গুর।
vog

উবুন্টুতে, ফলাফলগুলি ব্যবহার করে whichস্বয়ংক্রিয়ভাবে সিস্টেম কমান্ড এবং এ জাতীয় দ্বারা ব্যবহৃত ডিফল্টটি বেছে নেবে। এটি জেনেরিক এবং সিস্টেম এটি সঠিক ইনস্টলেশনতে চালিত করে।
এসডসোলার

9

শেলবাংয়ের উদ্দেশ্য হ'ল স্ক্রিপ্টটি যখন শেল থেকে স্ক্রিপ্টটি সম্পাদন করতে চান তখন স্ক্রিপ্টটি দোভাষীকে স্বীকৃতি দেয়। বেশিরভাগ ক্ষেত্রে এবং সর্বদা নয়, আপনি স্ক্রিপ্টগুলি বহিরাগতভাবে অনুবাদক সরবরাহ করে ute ব্যবহারের উদাহরণ:python-x.x script.py

আপনার কাছে শেবাং ঘোষক না থাকলেও এটি কাজ করবে।

প্রথমটি কেন আরও বেশি "পোর্টেবল" কারণ এটি হ'ল /usr/bin/envআপনার PATHঘোষণাপত্রে রয়েছে যা আপনার সিস্টেমের নির্বাহযোগ্য স্থানে থাকা সমস্ত গন্তব্যের জন্য অ্যাকাউন্ট করে।

দ্রষ্টব্য: টর্নেডো কঠোরভাবে শেবাং ব্যবহার করে না, এবং জ্যাঙ্গো কঠোরভাবে ব্যবহার করে না। আপনি কীভাবে আপনার অ্যাপ্লিকেশনটির মূল কাজটি চালাচ্ছেন তার সাথে এটি পরিবর্তিত হয়।

ALSO: পাইথনের সাথে এটি আলাদা হয় না।


8

কখনও কখনও, যদি উত্তর খুব স্পষ্ট নয় (আমি যদি হ্যাঁ বা না সিদ্ধান্ত নিতে পারে না মানে), তারপর তা না ব্যাপার অত্যধিক করে, এবং যতক্ষণ উত্তর আপনি সমস্যা উপেক্ষা করতে পারেন হয় স্পষ্ট।

#!শুধুমাত্র উদ্দেশ্যে স্ক্রিপ্ট চালু হয়। জ্যাঙ্গো নিজস্ব উত্সগুলি লোড করে এবং সেগুলি ব্যবহার করে। কোন দোভাষী ব্যবহার করা উচিত তা কখনই সিদ্ধান্ত নেওয়ার প্রয়োজন হয় না। এইভাবে, এখানে #!আসলে কোনও ধারণা নেই।

সাধারণত, যদি এটি মডিউল হয় এবং স্ক্রিপ্ট হিসাবে ব্যবহার না করা যায় তবে এটি ব্যবহার করার দরকার নেই #!। অন্যদিকে, একটি মডিউল উত্স প্রায়শই if __name__ == '__main__': ...কার্যকারিতার অন্তত কিছু তুচ্ছ পরীক্ষার সাথে থাকে। তারপরে #!আবার বোধগম্য হয়।

ব্যবহারের একটি ভাল কারণ #!হ'ল আপনি যখন পাইথন 2 এবং পাইথন 3 স্ক্রিপ্ট উভয়ই ব্যবহার করেন - সেগুলি অবশ্যই পাইথনের বিভিন্ন সংস্করণ দ্বারা ব্যাখ্যা করা উচিত। এইভাবে, আপনাকে মনে রাখতে pythonহবে ম্যানুয়ালি ( #!অভ্যন্তরীণ ব্যতীত) স্ক্রিপ্টটি চালু করার সময় কী ব্যবহার করা উচিত । আপনার যদি এই জাতীয় স্ক্রিপ্টগুলির মিশ্রণ থাকে তবে #!অভ্যন্তরটি ব্যবহার করা , তাদের সম্পাদনযোগ্য করে তোলা এবং এক্সিকিউটেবল (chmod ...) হিসাবে চালু করা ভাল ধারণা a

এমএস-উইন্ডোজ ব্যবহার করার #!সময়, কোনও ধারণা ছিল না - সম্প্রতি পর্যন্ত। পাইথন ৩.৩ একটি উইন্ডোজ পাইথন লঞ্চার (py.exe এবং pyw.exe) প্রবর্তন করে যা #!লাইনটি পড়ে , পাইথনের ইনস্টলড সংস্করণগুলি সনাক্ত করে এবং পাইথনের সঠিক বা স্পষ্টতই চেয়েছিল সংস্করণ ব্যবহার করে। এক্সটেনশানটি কোনও প্রোগ্রামের সাথে যুক্ত হতে পারে, আপনি উইন্ডোজতে ইউনিক্স-ভিত্তিক সিস্টেমে এক্সিকিউট ফ্ল্যাগের মতো আচরণ করতে পারেন।


3

আমি সম্প্রতি উইন্ডোজ on-এ যখন পাইথন ৩.6.১ ইনস্টল করেছি, তখন এটি উইন্ডোজের জন্য পাইথন লঞ্চার ইনস্টল করে, যা শেবাং লাইনটি পরিচালনা করার কথা। তবে, আমি দেখতে পেয়েছি যে পাইথন লঞ্চার এটি করেনি: শেবাং লাইন উপেক্ষা করা হয়েছিল এবং পাইথন ২.7.১৩ সর্বদা ব্যবহৃত হত (যদি না আমি পাই -৩ ব্যবহার করে স্ক্রিপ্টটি সম্পাদন করি)।

এটি ঠিক করতে, আমাকে উইন্ডোজ রেজিস্ট্রি কী সম্পাদনা করতে হয়েছিল HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command। এর এখনও মূল্য ছিল

"C:\Python27\python.exe" "%1" %*

আমার পূর্ববর্তী পাইথন ২.7 ইনস্টলেশন থেকে। আমি এই রেজিস্ট্রি কী মানটি পরিবর্তন করেছি

"C:\Windows\py.exe" "%1" %*

এবং পাইথন লঞ্চার শেবাং লাইন প্রক্রিয়াটি উপরে বর্ণিত হিসাবে কাজ করেছে।


2

আপনার যদি পৃথক মডিউল ইনস্টল থাকে এবং নির্দিষ্ট পাইথন ইনস্টলটি ব্যবহার করার দরকার পড়ে তবে শেবাং প্রথমে সীমাবদ্ধ বলে মনে হয়। তবে, শেবাংকে প্রথমে শেল স্ক্রিপ্ট হিসাবে চালিত হওয়ার জন্য এবং তারপরে অজগরটি চয়ন করতে আপনি নীচের মত কৌশলগুলি করতে পারেন। এটি অত্যন্ত নমনীয় ইমো:

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $PREFERRED_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

বা আরও ভাল, সম্ভবত, একাধিক অজগর স্ক্রিপ্ট জুড়ে কোড পুনরায় ব্যবহারের সুবিধার্থে:

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''

এবং তারপরে সিলেক্ট করুন.শ রয়েছে:

PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

1
যদিও আমি নিশ্চিত নই যে এর মতো বহুবিবাহ সাধারণত সাধারণভাবে অনুশীলন হয় তবে এটি অবশ্যই খুব আকর্ষণীয় পদ্ধতির এবং সম্ভবত এখানে সবচেয়ে নমনীয় উত্তর।
রায়ান আমোস

1
খুব ঠান্ডা. আমি বুঝতে পারি নি যে আপনি এটি করতে পারেন
user2233949

1

উত্তর: আপনি যদি এটিকে কোনও কমান্ড-লাইন সম্পাদনযোগ্য স্ক্রিপ্ট বানানোর পরিকল্পনা করেন তবেই।

পদ্ধতিটি এখানে:

সঠিক শেবাং স্ট্রিংটি ব্যবহারের জন্য যাচাই করে শুরু করুন:

which python

এটি থেকে আউটপুট নিন এবং এটিকে প্রথম লাইনে (শেবাং # দিয়ে) যুক্ত করুন।

আমার সিস্টেমে এটি এর মতো প্রতিক্রিয়া জানায়:

$which python
/usr/bin/python

সুতরাং আপনার শেবাং দেখতে পাবেন:

#!/usr/bin/python

সংরক্ষণের পরে, এটি এখনও আগের মতো চলবে যেহেতু পাইথন সেই প্রথম লাইনটিকে একটি মন্তব্য হিসাবে দেখবে।

python filename.py

কমান্ড তৈরি করতে, .py এক্সটেনশনটি ফেলে দেওয়ার জন্য এটি অনুলিপি করুন।

cp filename.py filename

ফাইল সিস্টেমকে বলুন যে এটি কার্যকর হবে:

chmod +x filename

এটি পরীক্ষা করতে, ব্যবহার করুন:

./filename

সেরা অনুশীলন হ'ল এটিকে আপনার $ PATH এর কোথাও স্থানান্তর করা যাতে আপনাকে কেবল টাইপ করতে হবে তা ফাইলের নাম।

sudo cp filename /usr/sbin

এইভাবে এটি সর্বত্র কাজ করবে (ফাইলের আগে। / ছাড়া)


আমি সন্দেহ করি যে এটি সর্বোত্তম অনুশীলন এবং আমি দৃ .়ভাবে গ্লাসঘস্টের সমাধানটি ব্যবহার করার পরামর্শ দিচ্ছি
কলিডিয়ার

আমি এটি সহায়ক খুঁজে পেয়েছি এবং এটি আমার জন্য সুন্দরভাবে কাজ করেছে। এটি ভাল ব্যাখ্যা করা হয়েছিল। তবে কেন এটি সর্বোত্তম অনুশীলন নয় তা নির্দেশ করে আমি মন্তব্যগুলির প্রশংসা করব। আমি শিখতে আগ্রহী।
চার্লস ক্যারিয়ার

0

সম্পূর্ণ বনাম যৌক্তিক পথ:

এটি পাইথন ইন্টারপ্রেটারের পথটি সম্পূর্ণরূপে বা যৌক্তিক ( /usr/bin/env) বহনযোগ্যতার ক্ষেত্রে হওয়া উচিত কিনা সে সম্পর্কে এটি সত্যিই একটি প্রশ্ন ।

এটি এবং অন্যান্য স্ট্যাক সাইট আছে, যা প্রমাণাদি সমর্থনকারী ছাড়া একটি সাধারণ ভাবে সমস্যা সম্পর্কে কথা বলত অন্যান্য উত্তর সম্মুখীন, আমি সত্যিই সঞ্চালিত করে থাকেন প্রকৃতই এই খুব প্রশ্নে, ঝুরা পরীক্ষামূলক & বিশ্লেষণ unix.stackexchange.com । এখানে এই উত্তরটি পেস্ট করার পরিবর্তে আমি যারা তুলনামূলক বিশ্লেষণে আগ্রহী তাদের সেই উত্তরে নির্দেশ করব:

https://unix.stackexchange.com/a/566019/334294

লিনাক্স ইঞ্জিনিয়ার হওয়ার কারণে আমার লক্ষ্যটি সর্বদা আমার বিকাশকারী ক্লায়েন্টদের জন্য সর্বাধিক উপযুক্ত, অনুকূলিত হোস্ট সরবরাহ করা, সুতরাং পাইথন পরিবেশের বিষয়টি এমন একটি বিষয় ছিল যাটির সত্যই আমাকে জবাব দেওয়া উচিত। পরীক্ষার পরে আমার মতামতটি ছিল যে শে-ব্যাংয়ের মধ্যে যৌক্তিক পথটি (2) বিকল্পগুলির চেয়ে ভাল।


-3

প্রথমে ব্যবহার করুন

which python

এটি আমার পাইথন ইন্টারপ্রেটার (বাইনারি) উপস্থিত লোকেশন হিসাবে আউটপুট দেবে।

এই আউটপুট যেমন কোনও হতে পারে

/usr/bin/python

অথবা

/bin/python

এখন যথাযথভাবে শেবাং লাইনটি নির্বাচন করুন এবং এটি ব্যবহার করুন।

সাধারণ করতে আমরা ব্যবহার করতে পারি:

#!/usr/bin/env

অথবা

#!/bin/env

3
এটি সম্ভবত অন্যান্য সিস্টেমে পোর্টেবল হবে না। #!/usr/bin/envআপনার জন্য সঠিক পছন্দ করে তোলে।
fragmentedreality

এজন্য আপনি whichকমান্ডটি ব্যবহার করেন - এটি আপনার নির্দিষ্ট সিস্টেমের জন্য সঠিক স্ট্রিং প্রদান করবে।
এসডসোলার

1
... এবং তারপর Everytime স্ক্রিপ্ট অন্য মেশিনে কার্যকর করা হয়, আপনি চালাতে which pythonআবার এবং স্ক্রিপ্ট পরিবর্তন থেকে বর্তমান কুঁড়েঘর আউটপুট পৃথক
fragmentedreality

2
এটি -1 এটি সবচেয়ে ভঙ্গুর সম্ভাব্য সমাধান। আপনার পাইথন স্ক্রিপ্টটি যে সিস্টেমে লেখা আছে কেবল সেই সিস্টেমের জন্যই এটি সঠিক হওয়ার গ্যারান্টিযুক্ত। বহনযোগ্যতার জন্য #! / Usr / bin / env পাইথন 3 ব্যবহার করুন
মাইলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.