আমার কাছে মনে হয় ফাইলগুলি সেই লাইন ছাড়াই চালাচ্ছে।
আমার কাছে মনে হয় ফাইলগুলি সেই লাইন ছাড়াই চালাচ্ছে।
উত্তর:
যদি আপনি পাইথনের বেশ কয়েকটি সংস্করণ ইনস্টল করেন /usr/bin/env
তবে নিশ্চিত করুন যে ব্যবহৃত দোভাষীটি আপনার পরিবেশের প্রথমটি $PATH
। বিকল্পটি হ'ল হার্ডকোডের মতো#!/usr/bin/python
; এটা ঠিক, কিন্তু কম নমনীয়।
ইউনিক্সে, একটি এক্সিকিউটেবল ফাইল যার অর্থ ব্যাখ্যা করা উচিত #!
তা প্রথম লাইনের শুরুতে দোভাষী ব্যবহার করার পরে কোন দোভাষী ব্যবহার করতে হবে তা নির্দেশ করতে পারে , এবং তার পরে দোভাষী (এবং কোনও পতাকা এটির প্রয়োজন হতে পারে)।
আপনি যদি অন্য প্ল্যাটফর্মগুলির বিষয়ে কথা বলছেন তবে অবশ্যই এই নিয়মটি প্রযোজ্য হবে না (তবে "শেবাং লাইন" কোনও ক্ষতি করে না এবং আপনি যদি কখনও লিনাক্স, ম্যাকের মতো কোনও ইউনিক্স বেসের সাথে প্ল্যাটফর্মে এই স্ক্রিপ্টটি অনুলিপি করেন তবে সহায়তা করবে) ইত্যাদি)।
chmod +x myscript.py
) তৈরি করে এবং তারপরে এটি সরাসরি চালানোর সময় প্রয়োগ করা হয়: ./myscript.py
কেবলমাত্র নয় python myscript.py
।
env
সর্বাধিক নমনীয়তা দেয় যাতে ব্যবহারকারী PATH পরিবর্তন করে দোভাষীকে ব্যবহার করতে পারেন। প্রায়শই এই নমনীয়তাটির প্রয়োজন হয় না এবং ডাউনসাইড হ'ল উদাহরণস্বরূপ লিনাক্স প্রক্রিয়াটির নামের জন্য স্ক্রিপ্টের নামটি ব্যবহার করতে পারে না ps
এবং "পাইথন" এ ফিরে আসে। উদাহরণস্বরূপ ডিস্ট্রো জন্য পাইথন অ্যাপস প্যাকেজিং যখন আমি ব্যবহার না করার পরামর্শ চাই env
।
py
লঞ্চার উইন্ডোজে শেবাং লাইন ব্যবহার করতে পারে। এটি পাইথন ৩.৩-এ অন্তর্ভুক্ত করা হয়েছে বা এটি স্বাধীনভাবে ইনস্টল করা যেতে পারে ।
/usr/bin/env: Key has expired
অনেক ঘন্টা পরে বার্তাটি দিয়ে মারা যাওয়ার প্রক্রিয়াগুলি করেছি ।
এটিকে শেবাং লাইন বলা হয় । উইকিপিডিয়া এন্ট্রি ব্যাখ্যা হিসাবে :
কম্পিউটিংয়ে একটি শেবাং (যা হ্যাশবাং, হ্যাশপলিং, পাউন্ড ব্যাং বা ক্রাঞ্চব্যাং নামেও পরিচিত) অক্ষরকে বোঝায় "#!" যখন তারা কোনও পাঠ্য ফাইলের প্রথম লাইন হিসাবে দোভাষীর নির্দেশনায় প্রথম দুটি অক্ষর হয়। ইউনিক্সের মতো অপারেটিং সিস্টেমে প্রোগ্রাম লোডার ফাইলটি একটি স্ক্রিপ্ট বলে ইঙ্গিত হিসাবে এই দুটি অক্ষরের উপস্থিতি নেয় এবং ফাইলের প্রথম লাইনের বাকী অংশ দ্বারা নির্দিষ্ট করা দোভাষী ব্যবহার করে সেই স্ক্রিপ্টটি কার্যকর করার চেষ্টা করে।
আরও দেখুন ইউনিক্স প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি ।
এমনকি উইন্ডোজে, যেখানে শেবাং লাইন দোভাষী চালিত করতে নির্ধারণ করে না, আপনি দোভাষীর কাছে শেবাং লাইনে নির্দিষ্ট করে বিকল্পগুলি পাস করতে পারেন। আমি জেনেরিক শেবাং লাইনটি এক-অফ স্ক্রিপ্টগুলিতে রাখার পক্ষে দরকারী মনে করি (যেমন এসও-তে প্রশ্নের উত্তর দেওয়ার সময় আমি যেগুলি লিখি) তাই আমি উইন্ডোজ এবং আর্কলিনাক্স উভয়ই তাড়াতাড়ি পরীক্ষা করতে পারি ।
Env উপযোগ আপনি পথে কমান্ড ডাকা অনুমতি দেয়:
প্রথম অবশিষ্ট বাকীটি আবেদনের জন্য প্রোগ্রামের নাম নির্দিষ্ট করে; এটি
PATH
পরিবেশের পরিবর্তনশীল অনুযায়ী অনুসন্ধান করা হয় । যে কোনও বাকি আর্গুমেন্ট সেই প্রোগ্রামের আর্গুমেন্ট হিসাবে পাস করা হয়।
অন্যান্য উত্তরের উপর কিছুটা প্রসারিত করে /usr/bin/env
শিবাং লাইনের অসতর্ক ব্যবহারের মাধ্যমে আপনার কমান্ড লাইন স্ক্রিপ্টগুলি কীভাবে সমস্যায় পড়তে পারে তার একটি ছোট উদাহরণ এখানে দেওয়া হয়েছে :
$ /usr/local/bin/python -V
Python 2.6.4
$ /usr/bin/python -V
Python 2.5.1
$ cat my_script.py
#!/usr/bin/env python
import json
print "hello, json"
$ PATH=/usr/local/bin:/usr/bin
$ ./my_script.py
hello, json
$ PATH=/usr/bin:/usr/local/bin
$ ./my_script.py
Traceback (most recent call last):
File "./my_script.py", line 2, in <module>
import json
ImportError: No module named json
পাইথন 2.5 তে জসন মডিউলটির অস্তিত্ব নেই।
এই ধরণের সমস্যার হাত থেকে রক্ষা করার এক উপায় হ'ল সংস্করণযুক্ত পাইথন কমান্ডের নামগুলি ব্যবহার করা যা সাধারণত বেশিরভাগ পাইথনগুলির সাথে ইনস্টল করা হয়:
$ cat my_script.py
#!/usr/bin/env python2.6
import json
print "hello, json"
আপনার যদি পাইথন ২.x এবং পাইথন ৩.x এর মধ্যে পার্থক্য করা প্রয়োজন, পাইথন 3 এর সাম্প্রতিক প্রকাশগুলি একটি python3
নামও সরবরাহ করে:
$ cat my_script.py
#!/usr/bin/env python3
import json
print("hello, json")
which python
আয় /usr/bin/python
, একটি স্থানীয় ডিরেক্টরি পথ হার্ড কোডেড করা যেতে পারে: #!/usr/bin/python
। তবে #!/usr/bin/env python
এটির চেয়ে কম নমনীয় যা বৈশ্বিক প্রয়োগ রয়েছে has
অজগর স্ক্রিপ্টটি চালাতে, আমাদের শেলটি তিনটি জিনিস বলতে হবে:
শেবাং কমপ্লিট #!
করে (১।) শেবাংটি শুরু হয়েছিল #
কারণ #
চরিত্রটি অনেক স্ক্রিপ্টিং ভাষায় একটি মন্তব্য চিহ্নিতকারী। শেবাং লাইনের সামগ্রীগুলি দোভাষী দ্বারা স্বয়ংক্রিয়ভাবে উপেক্ষা করা হবে।
env
কমান্ড সঞ্চালিত (2.) এবং (3)। "মাধ্যাকর্ষণ," উদ্ধৃতি
env
কমান্ডটির একটি সাধারণ ব্যবহার হ'ল দোভাষীদের চালু করা, env launch PATH যে আদেশটি প্রবর্তন করতে বলা হয় তার জন্য অনুসন্ধান করবে এই বিষয়টি ব্যবহার করে। যেহেতু শেবাং লাইনটি নির্দিষ্ট করার জন্য একটি নিখুঁত পাথের প্রয়োজন হয় এবং যেহেতু বিভিন্ন দোভাষী (পারল, বাশ, পাইথন) এর অবস্থান অনেক বেশি হতে পারে তাই এটি ব্যবহার করা সাধারণ:
#!/usr/bin/env perl
এটি / বিন / পার্ল, / ইউএসআর / বিন / পার্ল, / ইউএসআর / স্থানীয় / বিন / পারল, / ইউএসআর / স্থানীয় / পিকেজি / পার্ল, / ফাইলসভার / ইউএসআর / বিন / পার্ল, বা / বাড়ি কিনা তা অনুমান করার চেষ্টা করার পরিবর্তে / মিস্টার ড্যানিয়েল / ইউএসআর / বিন / পার্ল ব্যবহারকারীর সিস্টেমে ...অন্যদিকে, env প্রায় সবসময়ই / usr / bin / env এ থাকে। (যদি না হয় তবে; কিছু সিস্টেম সম্ভবত / বিন / এনভি ব্যবহার করতে পারে তবে এটি একটি বিরল ঘটনা এবং এটি কেবলমাত্র নন-লিনাক্স সিস্টেমে ঘটে))
আপনার প্রশ্নটি সম্ভবত এই অর্থে:
আপনি যদি ব্যবহার করতে চান: $python myscript.py
আপনার মোটেও সেই লাইনের দরকার নেই। সিস্টেমটি অজগরকে কল করবে এবং তারপরে পাইথন ইন্টারপ্রেটারটি আপনার স্ক্রিপ্টটি চালাবে।
আপনি যদি ব্যবহার করতে চান তবে: $./myscript.py
এটিকে সরাসরি কোনও সাধারণ প্রোগ্রাম বা বাশ স্ক্রিপ্টের মতো কল করে আপনার কোন সিস্টেমটি চালানোর জন্য সিস্টেমটি ব্যবহার করে তা নির্দিষ্ট করার জন্য সেই লাইনটি লিখতে হবে (এবং এটি দিয়ে এটি কার্যকর করার যোগ্যও হবে chmod 755
)
exec
লিনাক্স কার্নেল সিস্টেম কল shebangs বুঝতে পারে ( #!
) নেটিভ
আপনি যখন ব্যাশ করবেন:
./something
লিনাক্সে, exec
এটি পথের সাথে সিস্টেম কলকে কল করে ./something
।
কার্নেলের এই লাইনটি এই ফাইলটিতে পাঠানো হবে exec
: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
এটি ফাইলের প্রথম বাইটগুলি পড়ে এবং তাদের সাথে তুলনা করে #!
।
যদি তুলনাটি সত্য হয়, তবে বাকী রেখাটি লিনাক্স কার্নেল দ্বারা বিশ্লেষণ করা হয়েছে, যা প্রথম আর্গুমেন্ট হিসাবে exec
পাথ /usr/bin/env python
এবং বর্তমান ফাইলের সাথে আরেকটি কল করে :
/usr/bin/env python /path/to/script.py
এবং এটি যে কোনও স্ক্রিপ্টিং ভাষার ব্যবহার করে for #
মন্তব্য চরিত্র হিসাবে ।
এবং হ্যাঁ, আপনি এটি দিয়ে একটি অসীম লুপ তৈরি করতে পারেন:
printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a
বাশ ত্রুটিটি সনাক্ত করে:
-bash: /a: /a: bad interpreter: Too many levels of symbolic links
#!
মানুষের পাঠযোগ্য হতে পারে, তবে এটির প্রয়োজন নেই।
যদি ফাইলটি বিভিন্ন বাইট দিয়ে শুরু হয়, তবে exec
সিস্টেম কলটি একটি ভিন্ন হ্যান্ডলার ব্যবহার করবে। অন্যান্য গুরুত্বপূর্ণ অন্তর্নির্মিত হ্যান্ডলারটি ইএলএফ এক্সিকিউটেবল ফাইলগুলির জন্য: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305 যা বাইটগুলি পরীক্ষা করে 7f 45 4c 46
(যা মানুষের মতো হয়ে ওঠে জন্য পঠনযোগ্য .ELF
)। আসুন নিশ্চিত করুন যে 4 টি প্রথম বাইট পড়ে /bin/ls
, যা একটি ELF কার্যকর হয়:
head -c 4 "$(which ls)" | hd
আউটপুট:
00000000 7f 45 4c 46 |.ELF|
00000004
সুতরাং যখন কার্নেলটি সেই বাইটগুলি দেখে, এটি ELF ফাইলটি নেয়, এটিকে সঠিকভাবে মেমরিতে রাখে এবং এটি দিয়ে একটি নতুন প্রক্রিয়া শুরু করে। আরও দেখুন: কীভাবে কার্নেল লিনাক্সের অধীনে একটি এক্সিকিউটেবল বাইনারি ফাইল পায়?
অবশেষে, আপনি binfmt_misc
যান্ত্রিকতার সাথে আপনার নিজের শেবাং হ্যান্ডলার যুক্ত করতে পারেন । উদাহরণস্বরূপ, আপনি ফাইলগুলির জন্য.jar
একটি কাস্টম হ্যান্ডলার যুক্ত করতে পারেন । এই প্রক্রিয়াটি এমনকি ফাইল এক্সটেনশনের মাধ্যমে হ্যান্ডলারদের সমর্থন করে। অন্য অ্যাপ্লিকেশনে হয় ও QEMU সঙ্গে একটি ভিন্ন স্থাপত্যের স্বচ্ছভাবে চালানো এক্সেকিউটেবল ।
আমি মনে করি না POSIX নির্দিষ্ট করে shebangs তবে: https://unix.stackexchange.com/a/346214/32558 , যদিও এটি যুক্তিপূর্ণ বিভাগে সালে উল্লেখ করে, এবং ফর্ম "এ এক্সিকিউটেবল স্ক্রিপ্ট সিস্টেম কিছু দ্বারা সমর্থিত যদি may ঘটতে "। ম্যাকোস এবং ফ্রিবিএসডি এটিকে প্রয়োগ করতে পারে বলে মনে হয়।
PATH
অনুসন্ধান প্রেরণা
সম্ভবত, শেবাংগুলির অস্তিত্বের জন্য একটি বড় অনুপ্রেরণা হ'ল লিনাক্সে আমরা প্রায়শই PATH
ঠিক একইভাবে কমান্ড চালাতে চাই :
basename-of-command
পরিবর্তে:
/full/path/to/basename-of-command
তবে তারপরে, শেবাং পদ্ধতি ব্যতীত লিনাক্স কীভাবে জানবে যে প্রতিটি ধরণের ফাইল চালু করতে পারে?
কমান্ডগুলিতে এক্সটেনশনটিকে হার্ডকোডিং:
basename-of-command.py
বা প্রতিটি দোভাষীর উপর PATH অনুসন্ধান প্রয়োগ করে:
python basename-of-command
একটি সম্ভাবনা হতে পারে, তবে এর মধ্যে প্রধান সমস্যাটি হ'ল যদি আমরা কখনও কমান্ডটিকে অন্য ভাষায় রূপান্তর করার সিদ্ধান্ত নিই তবে সবকিছু ভেঙে যায়।
শেবাংগুলি সুন্দরভাবে এই সমস্যাটি সমাধান করে।
প্রযুক্তিগতভাবে, পাইথনে এটি কেবল একটি মন্তব্য লাইনের।
এই লাইনটি কেবলমাত্র যদি আপনি শেল থেকে পাই ক্রিপ্টটি চালিত করেন (কমান্ড লাইন থেকে)। এটি " শেবাং " নামে পরিচিত ! , এবং এটি কেবল পাইথন স্ক্রিপ্টগুলির সাথে নয়, বিভিন্ন পরিস্থিতিতে ব্যবহার করা হয়।
এখানে, এটি শেলটিকে পাইথনের একটি নির্দিষ্ট সংস্করণ শুরু করতে (বাকী ফাইলটির যত্ন নিতে) নির্দেশ দেয়।
py.exe
। এটি একটি স্ট্যান্ডার্ড পাইথন ইনস্টলেশনের অংশ।
এটি করার প্রধান কারণ হ'ল অপারেটিং সিস্টেমের পরিবেশে স্ক্রিপ্টটি পোর্টেবলযোগ্য করে তোলা।
উদাহরণস্বরূপ মিংডাব্লুতে, পাইথন স্ক্রিপ্টগুলি ব্যবহার করে:
#!/c/python3k/python
এবং জিএনইউ / লিনাক্স বিতরণের অধীনে এটি হয়:
#!/usr/local/bin/python
অথবা
#!/usr/bin/python
এবং সর্বোত্তম বাণিজ্যিক ইউনিক্স sw / hw সিস্টেমের অধীনে (ওএস / এক্স), এটি হ'ল:
#!/Applications/MacPython 2.5/python
বা ফ্রিবিএসডি তে:
#!/usr/local/bin/python
তবে এই সমস্ত পার্থক্যগুলি স্ক্রিপ্টটি ব্যবহার করে সমস্তগুলিতে পোর্টেবল করতে পারে:
#!/usr/bin/env python
/usr/bin/python
। লিনাক্সের অধীনে, সিস্টেম দ্বারা ইনস্টল করা পাইথনটিও প্রায় নিশ্চিতভাবেই রয়েছে /usr/bin/python
(আমি এর আগে আর কিছু দেখিনি এবং এর কোনও অর্থ হবে না)। মনে রাখবেন যে সিস্টেমগুলি নাও থাকতে পারে /usr/bin/env
।
python
এটি পোর্টেবল নয়, এটি ডিস্ট্রিবিউশন ডিফল্ট পাইথন ইন্টারপ্রেটার। আর্ক লিনাক্স দীর্ঘ সময়ের জন্য পাইথন 3 এ ডিফল্ট রয়েছে এবং বিতরণগুলিও এটি নিয়ে ভাবতে পারে কারণ পাইথন 2 কেবলমাত্র 2020 পর্যন্ত সমর্থিত
সর্বাধিক মিস হওয়া একটি জিনিসের উপর জোর দেওয়া সম্ভবত বোধগম্য, যা তাত্ক্ষণিক বুঝতে আটকাতে পারে। আপনি যখন python
টার্মিনাল টাইপ করেন আপনি সাধারণত একটি পূর্ণ পথ সরবরাহ করেন না। পরিবর্তে, এক্সিকিউটেবল আপ PATH
পরিবেশের পরিবর্তনশীল মধ্যে সন্ধান করা হয়। ঘুরেফিরে , আপনি যখন পাইথন প্রোগ্রামটি সরাসরি চালনা করতে চান, তখন /path/to/app.py
অবশ্যই শেলকে অবশ্যই কোন দোভাষী ব্যবহার করতে হবে তা ( হ্যাশবাংয়ের মাধ্যমে , অন্যান্য অবদানকারীরা উপরে কি ব্যাখ্যা করছে) must
হাশবাং একজন দোভাষীর পুরো পথ আশা করে । সুতরাং আপনার পাইথন প্রোগ্রামটি সরাসরি চালাতে আপনাকে পাইথন বাইনারিটির পুরো পথ সরবরাহ করতে হবে যা উল্লেখযোগ্যভাবে পরিবর্তিত হয়, বিশেষত ভার্চুয়ালেনভের ব্যবহার বিবেচনা করে । বহনযোগ্যতা মোকাবেলার জন্য ট্রিক /usr/bin/env
ব্যবহার করা হয়। পরেরটি মূলত পরিবেশে স্থান পরিবর্তন করতে এবং এটিতে একটি কমান্ড চালানোর উদ্দেশ্যে। যখন কোনও পরিবর্তন সরবরাহ করা হয় না এটি বর্তমান পরিবেশে কমান্ডটি চালায় যা কার্যকরভাবে একই PATH
চেহারাতে কার্যকর হয় যা কৌশলটি করে।
এটি একটি শেল কনভেনশন যা শেলকে জানায় যে প্রোগ্রামটি স্ক্রিপ্টটি কার্যকর করতে পারে।
#! / usr / বিন / এনভিভ পাইথন
পাইথন বাইনারি যাওয়ার পথে সমাধান করে।
এটি প্রস্তাবিত উপায়ে, ডকুমেন্টেশনে প্রস্তাবিত:
2.2.2। এক্সিকিউটেবল পাইথন স্ক্রিপ্টস
BSD'ish ইউনিক্স সিস্টেমে পাইথন স্ক্রিপ্টগুলি লাইন স্থাপন করে শেল স্ক্রিপ্টগুলির মতো সরাসরি নির্বাহযোগ্য করা যায়
#! /usr/bin/env python3.2
http://docs.python.org/py3k/tutorial/interpreter.html#executable-python-script থেকে
আপনি এই সমস্যাটি ভার্চুয়ালেনভ ব্যবহার করে দেখতে পারেন
এখানে টেস্ট.পি
#! /usr/bin/env python
import sys
print(sys.version)
ভার্চুয়াল পরিবেশ তৈরি করুন
virtualenv test2.6 -p /usr/bin/python2.6
virtualenv test2.7 -p /usr/bin/python2.7
প্রতিটি পরিবেশ সক্রিয় করুন তারপরে পার্থক্যগুলি পরীক্ষা করুন
echo $PATH
./test.py
এটি কেবল আপনি কোন দোভাষী ব্যবহার করতে চান তা নির্দিষ্ট করে। এটি বুঝতে, টার্মিনালের মাধ্যমে একটি ফাইল তৈরি করুন touch test.py
, তারপরে সেই ফাইলটিতে নিম্নলিখিত টাইপ করুন:
#!/usr/bin/env python3
print "test"
এবং chmod +x test.py
আপনার স্ক্রিপ্টটি কার্যকর করার জন্য করুন। এর পরে আপনি যখন করবেন তখন আপনার এই ./test.py
বলে একটি ত্রুটি পাওয়া উচিত:
File "./test.py", line 2
print "test"
^
SyntaxError: Missing parentheses in call to 'print'
কারণ পাইথন 3 মুদ্রক অপারেটরকে সহায়তা করে না।
এখন এগিয়ে যান এবং আপনার কোডের প্রথম লাইনটি এতে পরিবর্তন করুন:
#!/usr/bin/env python2
এবং এটি test
স্টাডাউটে মুদ্রণ কাজ করবে , কারণ পাইথন 2 প্রিন্ট অপারেটরকে সমর্থন করে। সুতরাং, এখন আপনি কীভাবে স্ক্রিপ্ট ইন্টারপ্রেটারদের মধ্যে স্যুইচ করবেন তা শিখলেন।
আমার কাছে মনে হয় ফাইলগুলি সেই লাইন ছাড়াই চালাচ্ছে।
যদি তাই হয়, তবে সম্ভবত আপনি উইন্ডোজে পাইথন প্রোগ্রামটি চালাচ্ছেন? উইন্ডোজ সেই লাইনটি ব্যবহার করে না - পরিবর্তে ফাইল এক্সটেনশনের সাথে যুক্ত প্রোগ্রামটি চালাতে ফাইল-নাম এক্সটেনশন ব্যবহার করে।
তবে ২০১১ সালে, একটি "পাইথন লঞ্চার" তৈরি করা হয়েছিল যা উইন্ডোজের জন্য এই লিনাক্স আচরণের নকল করে (কিছুটা পরিমাণে)। এটি কেবল পাইথন ইন্টারপ্রেটারটি বেছে নেওয়ার ক্ষেত্রেই সীমাবদ্ধ - যেমন দুটি সিস্টেমে ইনস্টলড সিস্টেমে পাইথন 2 এবং পাইথন 3 এর মধ্যে নির্বাচন করা। ল্যাঞ্চারটি py.exe
পাইথন ইনস্টলেশন হিসাবে optionচ্ছিকভাবে ইনস্টল করা হয়েছে এবং এটি .py
ফাইলগুলির সাথে যুক্ত হতে পারে যাতে প্রবর্তক সেই লাইনটি পরীক্ষা করে দেখতে পারেন এবং পরিবর্তে নির্দিষ্ট পাইথন ইন্টারপ্রেটার সংস্করণটি চালু করে।
$ python myscript.py
।
এটি একটি "আসল" উত্তরের চেয়ে historicalতিহাসিক তথ্য হিসাবে বোঝানো হয়েছে।
যেদিন তুমি অপারেটিং সিস্টেমগুলি যার ডিজাইনার সব যেখানে কাপড় রাখা তাদের নিজস্ব ধারণা ছিল, এবং কখনও কখনও পাইথন, পার্ল, ব্যাশ, বা অন্যান্য গনুহ / ওপেন সোর্স উপাদান প্রচুর অন্তর্ভুক্ত করা হয়নি মত UNIX প্রচুর ছিল যে ফিরে মনে রাখবেন সব সময়ে ।
এটি বিভিন্ন লিনাক্স বিতরণের ক্ষেত্রেও সত্য ছিল। লিনাক্সে - প্রাক-এফএইচএস [1] -আপনার / ইউএসআর / বিন / বা / ইউএসআর / স্থানীয় / বিন / তে পাইথন থাকতে পারে। অথবা এটি ইনস্টল করা নাও থাকতে পারে, সুতরাং আপনি নিজের তৈরি করে এটিকে ~ / বিনে রেখেছেন
আলেকৃতভাবে বার্কলে ইউনিক্স থেকে সিস্টেম ভি-তে রূপান্তর হিসাবে সোলারিস সবচেয়ে খারাপ কাজ করেছিলেন You আপনি / usr /, / usr / স্থানীয় /, / usr / ucb, / opt / ইত্যাদিতে স্টাফ দিয়ে যেতে পারেন This কিছু সত্যিই দীর্ঘ পথের জন্য। আমার সানফ্রিওয়্যার.কম থেকে প্রতিটি প্যাকেজটি নিজস্ব ডিরেক্টরিতে ইনস্টল করার জিনিসগুলির স্মৃতি রয়েছে, তবে এটি বাইনারিগুলিকে / usr / বিনের সাথে সিমলিঙ্ক করেছে কিনা তা আমি মনে করতে পারি না।
ওহ, এবং কখনও কখনও / usr / বিন একটি এনএফএস সার্ভারে ছিল [2]।
সুতরাং env
এই চারপাশে কাজ করার জন্য ইউটিলিটিটি বিকশিত হয়েছিল।
তারপরে আপনি লিখতে পারতেন #!/bin/env interpreter
এবং যতক্ষণ পথ সঠিক ছিল ততক্ষণে জিনিসগুলি চলার যুক্তিসঙ্গত সুযোগ ছিল । অবশ্যই, যুক্তিসঙ্গত অর্থ (পাইথন এবং পার্লের জন্য) যে আপনি উপযুক্ত পরিবেশগত পরিবর্তনগুলিও সেট করেছিলেন। Bash / ksh / zsh এর জন্য এটি কেবল কাজ করেছে worked
এটি গুরুত্বপূর্ণ ছিল কারণ লোকেরা শেল স্ক্রিপ্টগুলির (পারল এবং পাইথনের মতো) কাছাকাছি যাচ্ছিল এবং যদি আপনি আপনার রেড হ্যাট লিনাক্স ওয়ার্কস্টেশনটিতে হার্ড / কোড / ইউএসআর / বিন / পাইথন ব্যবহার করেন তবে এটি কোনও এসজিআইয়ের উপর খারাপ ভাঙ্গতে চলেছে ... ভাল, না , আমি মনে করি আইআরআইএক্স সঠিক জায়গায় অজগর স্থাপন করেছে। তবে একটি স্পার্ক স্টেশনে এটি সম্ভবত চলবে না।
আমি আমার স্পার্ক স্টেশন মিস করছি। তবে অনেক কিছু নয়। ঠিক আছে, এখন আপনি আমাকে ই-বেতে ঘুরে বেড়াচ্ছেন। Bastages।
[1] ফাইল-সিস্টেম হায়ারার্কি স্ট্যান্ডার্ড। https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
[2] হ্যাঁ, এবং কখনও কখনও লোকেরা এখনও এ জাতীয় জিনিসগুলি করে। এবং না, আমি আমার বেল্টে শালগম বা একটি পেঁয়াজ পরে নি।
আপনি যদি ভার্চুয়াল পরিবেশে আপনার স্ক্রিপ্টটি চালাচ্ছেন, বলুন venv
, তারপরে which python
কাজ করার সময় এক্সিকিউট করা venv
পাইথন ইন্টারপ্রেটারের পথ প্রদর্শন করবে:
~/Envs/venv/bin/python
নোট করুন যে ভার্চুয়াল পরিবেশের নামটি পাইথন ইন্টারপ্রেটারের পথে এমবেড করা আছে mbed সুতরাং, আপনার স্ক্রিপ্টে এই পথটিকে হার্ডকোড করা দুটি সমস্যার কারণ হবে:
অতএব, জোনাথনের উত্তরে যুক্ত করার জন্য #!/usr/bin/env python
, আদর্শ শেবাংটি কেবল ওএসের জুড়ে বহনযোগ্যতার জন্য নয়, ভার্চুয়াল পরিবেশেও বহনযোগ্যতার জন্য!
python2
এবং এর মধ্যে পোর্টেবিলিটি সমস্যাগুলি বিবেচনা করে python3
আপনার প্রোগ্রাম দুটির সাথে সামঞ্জস্য না করা অবধি আপনার সর্বদা দুটি সংস্করণ নির্দিষ্ট করা উচিত।
কিছু বিতরণ এখন কিছুক্ষণের জন্য python
সিমলিংকড শিপিং python3
করছে - python
থাকার উপর নির্ভর করবেন না python2
।
এটি পিইপি 394 দ্বারা জোর দেওয়া :
প্ল্যাটফর্মগুলিতে পার্থক্য সহ্য করার জন্য, সমস্ত নতুন কোড যা পাইথন ইন্টারপ্রেটারকে আহ্বান করতে হবে সেগুলি পাইথন নির্দিষ্ট করে না, বরং পাইথন 2 বা পাইথন 3 (বা আরও নির্দিষ্ট পাইথন 2.x এবং পাইথন 3.x সংস্করণগুলি নির্দিষ্ট করে; মাইগ্রেশন নোটগুলি দেখুন ) । এই পার্থক্যটি শেবাংগুলিতে করা উচিত, যখন শেল স্ক্রিপ্ট থেকে প্রার্থনা করার সময়, সিস্টেমের মাধ্যমে () কল করার সময় বা অন্য কোনও প্রসঙ্গে প্রেরণ করা হয়।
এটি আপনাকে কার্যকর করতে সক্ষম যা আপনি ব্যবহার করতে চান তা নির্বাচন করতে অনুমতি দেয়; এটি খুব সহজ যদি আপনার একাধিক পাইথন ইনস্টল থাকে এবং প্রত্যেকটিতে আলাদা আলাদা মডিউল থাকে এবং চয়ন করতে চান। যেমন
#!/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 $ALTERNATIVE_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())
এটি স্ক্রিপ্টটি বলে যেখানে অজগর ডিরেক্টরিটি রয়েছে!
#! /usr/bin/env python
#!/usr/bin/env python
শীর্ষে থাকা ওয়েবপৃষ্ঠাটি চালাবে এবং প্রদর্শন করবে ।