লোকেরা পাইথন স্ক্রিপ্টের প্রথম লাইনে #! / Usr / bin / env পাইথন শেবাং লিখবে কেন?


1046

আমার কাছে মনে হয় ফাইলগুলি সেই লাইন ছাড়াই চালাচ্ছে।


1
নীচের উত্তরটি জানিয়েছে যে এটি কেবল একটি মন্তব্য লাইনের। এটা সবসময় হয় না। আমার একটি "হ্যালো, ওয়ার্ল্ড!" সিজিআই স্ক্রিপ্ট (.py) যা কেবলমাত্র #!/usr/bin/env pythonশীর্ষে থাকা ওয়েবপৃষ্ঠাটি চালাবে এবং প্রদর্শন করবে ।
চকোটে


তারা দৌড়াতে পারে, তবে উদ্দিষ্ট পরিবেশে নয়
নিকোলাস হ্যামিল্টন

17
আমি এই পোস্টটি 7 বছরে বহুবার দেখেছি কারণ আমি মাঝে মাঝে এনভির হ্যাশবাংকে ভুলে যাই। পাস্তা অনুলিপি করুন :)
বাগহান্টরক

উত্তর:


1082

যদি আপনি পাইথনের বেশ কয়েকটি সংস্করণ ইনস্টল করেন /usr/bin/envতবে নিশ্চিত করুন যে ব্যবহৃত দোভাষীটি আপনার পরিবেশের প্রথমটি $PATH। বিকল্পটি হ'ল হার্ডকোডের মতো#!/usr/bin/python ; এটা ঠিক, কিন্তু কম নমনীয়।

ইউনিক্সে, একটি এক্সিকিউটেবল ফাইল যার অর্থ ব্যাখ্যা করা উচিত #!তা প্রথম লাইনের শুরুতে দোভাষী ব্যবহার করার পরে কোন দোভাষী ব্যবহার করতে হবে তা নির্দেশ করতে পারে , এবং তার পরে দোভাষী (এবং কোনও পতাকা এটির প্রয়োজন হতে পারে)।

আপনি যদি অন্য প্ল্যাটফর্মগুলির বিষয়ে কথা বলছেন তবে অবশ্যই এই নিয়মটি প্রযোজ্য হবে না (তবে "শেবাং লাইন" কোনও ক্ষতি করে না এবং আপনি যদি কখনও লিনাক্স, ম্যাকের মতো কোনও ইউনিক্স বেসের সাথে প্ল্যাটফর্মে এই স্ক্রিপ্টটি অনুলিপি করেন তবে সহায়তা করবে) ইত্যাদি)।


267
কেবল যোগ করার জন্য: আপনি ইউনিক্সে এটি কার্যকর করার যোগ্য ( chmod +x myscript.py) তৈরি করে এবং তারপরে এটি সরাসরি চালানোর সময় প্রয়োগ করা হয়: ./myscript.pyকেবলমাত্র নয় python myscript.py
ক্রেগ ম্যাককুইন

28
ব্যবহারকারী envসর্বাধিক নমনীয়তা দেয় যাতে ব্যবহারকারী PATH পরিবর্তন করে দোভাষীকে ব্যবহার করতে পারেন। প্রায়শই এই নমনীয়তাটির প্রয়োজন হয় না এবং ডাউনসাইড হ'ল উদাহরণস্বরূপ লিনাক্স প্রক্রিয়াটির নামের জন্য স্ক্রিপ্টের নামটি ব্যবহার করতে পারে না psএবং "পাইথন" এ ফিরে আসে। উদাহরণস্বরূপ ডিস্ট্রো জন্য পাইথন অ্যাপস প্যাকেজিং যখন আমি ব্যবহার না করার পরামর্শ চাই env
পিক্সেলবিট

9
pyলঞ্চার উইন্ডোজে শেবাং লাইন ব্যবহার করতে পারে। এটি পাইথন ৩.৩-এ অন্তর্ভুক্ত করা হয়েছে বা এটি স্বাধীনভাবে ইনস্টল করা যেতে পারে
jfs

6
সতর্কতার একটি গুরুত্বপূর্ণ শব্দ, এনভির রিটার্ন মান অবশেষে শেষ হয়। আপনি স্বল্পকালীন প্রক্রিয়া চালিয়ে যা যা আপনাকে প্রভাবিত করার সম্ভাবনা কম। যাইহোক, আমি /usr/bin/env: Key has expiredঅনেক ঘন্টা পরে বার্তাটি দিয়ে মারা যাওয়ার প্রক্রিয়াগুলি করেছি ।
ম্যালভারডিয়ার

4
@ ম্যালভারডিয়ার আপনি কি এই সংস্থান শেষ হওয়ার আচরণটি ব্যাখ্যা করে এমন কোনও সংস্থার সাথে লিঙ্ক করতে পারেন? আমি তাদের খুঁজে পাচ্ছি না।
মাইকেল

266

এটিকে শেবাং লাইন বলা হয় । উইকিপিডিয়া এন্ট্রি ব্যাখ্যা হিসাবে :

কম্পিউটিংয়ে একটি শেবাং (যা হ্যাশবাং, হ্যাশপলিং, পাউন্ড ব্যাং বা ক্রাঞ্চব্যাং নামেও পরিচিত) অক্ষরকে বোঝায় "#!" যখন তারা কোনও পাঠ্য ফাইলের প্রথম লাইন হিসাবে দোভাষীর নির্দেশনায় প্রথম দুটি অক্ষর হয়। ইউনিক্সের মতো অপারেটিং সিস্টেমে প্রোগ্রাম লোডার ফাইলটি একটি স্ক্রিপ্ট বলে ইঙ্গিত হিসাবে এই দুটি অক্ষরের উপস্থিতি নেয় এবং ফাইলের প্রথম লাইনের বাকী অংশ দ্বারা নির্দিষ্ট করা দোভাষী ব্যবহার করে সেই স্ক্রিপ্টটি কার্যকর করার চেষ্টা করে।

আরও দেখুন ইউনিক্স প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি

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

Env উপযোগ আপনি পথে কমান্ড ডাকা অনুমতি দেয়:

প্রথম অবশিষ্ট বাকীটি আবেদনের জন্য প্রোগ্রামের নাম নির্দিষ্ট করে; এটি PATHপরিবেশের পরিবর্তনশীল অনুযায়ী অনুসন্ধান করা হয় । যে কোনও বাকি আর্গুমেন্ট সেই প্রোগ্রামের আর্গুমেন্ট হিসাবে পাস করা হয়।


30
গুগলের সাথে সন্ধান করা সহজ - যদি কেউ কীওয়ার্ডগুলি জানেন তবে ("শেবাং লাইন" প্রয়োজনীয়)।
আরাফ্যাজিওন

14
প্রকৃতপক্ষে, এই ব্যাখ্যাটি আমি গুগলের সাথে যাচাই করেছিলাম এমন অন্যান্য রেফারেন্সগুলির তুলনায় আরও স্পষ্ট। প্রতিটি সম্ভাব্য ব্যবহারের জন্য একটি সম্পূর্ণ ম্যানুয়াল পড়ার চেয়ে প্রশ্নটিকে লক্ষ্য করে 1 অনুচ্ছেদের ব্যাখ্যা পাওয়া সর্বদা সুন্দর।
স্যাম গোল্ডবার্গ

1
@ আরাফানজিওন আপনি সম্ভবত এই প্রশ্নটিকে দরকারী মনে করবেন। টিএল; ডিআর: প্রতীকহাউন্ড ডটকম
উল্টোটকো

@ জুলিদকো: আকর্ষণীয় সার্চ ইঞ্জিন, উত্তর লেখার বিষয়ে বিবেচনা করুন যাতে জন গার্সিয়াসের প্রশ্নের আরও ভাল উত্তর পাওয়া যায়।
আরাফ্যাজিওন

1
"এমনকি উইন্ডোজেও, যেখানে শেবাং লাইন ইন্টারপ্রেটার চালাতে হবে তা নির্ধারণ করে না, আপনি দোভাষীর কাছে শেবাং লাইনে নির্দিষ্ট করে বিকল্পগুলি দিতে পারেন।" এটি কেবল মিথ্যা; যদি এরকম কিছু ঘটে থাকে, কারণ দোভাষী নিজেই শেবাং লাইনটি প্রক্রিয়াজাত করছেন। শেবাং লাইনের জন্য যদি দোভাষীর কোনও বিশেষ স্বীকৃতি না থাকে তবে এ জাতীয় কোনও ঘটনা ঘটে না। উইন্ডোজ কুঁড়েঘর লাইনের কিছু না "আপনি কি এই ক্ষেত্রে বর্ণনা করা যেতে পারে পাইথন লঞ্চার হল:। Python.org/dev/peps/pep-0397
Kaz

154

অন্যান্য উত্তরের উপর কিছুটা প্রসারিত করে /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")

27
হুম, আমি এই পোস্টটি থেকে বেরিয়ে এলাম না।
গ্লেন জ্যাকম্যান

1
স্থানীয় এবং বৈশ্বিক মধ্যে পার্থক্য। তাহলে which pythonআয় /usr/bin/python, একটি স্থানীয় ডিরেক্টরি পথ হার্ড কোডেড করা যেতে পারে: #!/usr/bin/python। তবে #!/usr/bin/env pythonএটির চেয়ে কম নমনীয় যা বৈশ্বিক প্রয়োগ রয়েছে has
noobninja

85

অজগর স্ক্রিপ্টটি চালাতে, আমাদের শেলটি তিনটি জিনিস বলতে হবে:

  1. ফাইলটি একটি স্ক্রিপ্ট
  2. কোন দোভাষী আমরা স্ক্রিপ্টটি কার্যকর করতে চাই
  3. দোভাষী দের পথ

শেবাং কমপ্লিট #!করে (১।) শেবাংটি শুরু হয়েছিল #কারণ #চরিত্রটি অনেক স্ক্রিপ্টিং ভাষায় একটি মন্তব্য চিহ্নিতকারী। শেবাং লাইনের সামগ্রীগুলি দোভাষী দ্বারা স্বয়ংক্রিয়ভাবে উপেক্ষা করা হবে।

envকমান্ড সঞ্চালিত (2.) এবং (3)। "মাধ্যাকর্ষণ," উদ্ধৃতি

envকমান্ডটির একটি সাধারণ ব্যবহার হ'ল দোভাষীদের চালু করা, env launch PATH যে আদেশটি প্রবর্তন করতে বলা হয় তার জন্য অনুসন্ধান করবে এই বিষয়টি ব্যবহার করে। যেহেতু শেবাং লাইনটি নির্দিষ্ট করার জন্য একটি নিখুঁত পাথের প্রয়োজন হয় এবং যেহেতু বিভিন্ন দোভাষী (পারল, বাশ, পাইথন) এর অবস্থান অনেক বেশি হতে পারে তাই এটি ব্যবহার করা সাধারণ:

#!/usr/bin/env perl  এটি / বিন / পার্ল, / ইউএসআর / বিন / পার্ল, / ইউএসআর / স্থানীয় / বিন / পারল, / ইউএসআর / স্থানীয় / পিকেজি / পার্ল, / ফাইলসভার / ইউএসআর / বিন / পার্ল, বা / বাড়ি কিনা তা অনুমান করার চেষ্টা করার পরিবর্তে / মিস্টার ড্যানিয়েল / ইউএসআর / বিন / পার্ল ব্যবহারকারীর সিস্টেমে ...

অন্যদিকে, env প্রায় সবসময়ই / usr / bin / env এ থাকে। (যদি না হয় তবে; কিছু সিস্টেম সম্ভবত / বিন / এনভি ব্যবহার করতে পারে তবে এটি একটি বিরল ঘটনা এবং এটি কেবলমাত্র নন-লিনাক্স সিস্টেমে ঘটে))


1
"গুরুতরতা" কোথায়?
পেসারিয়ার

44

আপনার প্রশ্নটি সম্ভবত এই অর্থে:

আপনি যদি ব্যবহার করতে চান: $python myscript.py

আপনার মোটেও সেই লাইনের দরকার নেই। সিস্টেমটি অজগরকে কল করবে এবং তারপরে পাইথন ইন্টারপ্রেটারটি আপনার স্ক্রিপ্টটি চালাবে।

আপনি যদি ব্যবহার করতে চান তবে: $./myscript.py

এটিকে সরাসরি কোনও সাধারণ প্রোগ্রাম বা বাশ স্ক্রিপ্টের মতো কল করে আপনার কোন সিস্টেমটি চালানোর জন্য সিস্টেমটি ব্যবহার করে তা নির্দিষ্ট করার জন্য সেই লাইনটি লিখতে হবে (এবং এটি দিয়ে এটি কার্যকর করার যোগ্যও হবে chmod 755)


অথবা আপনি পাইথন 3 myscript.py লিখতে পারেন
বিজয় শঙ্কর

44

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

একটি সম্ভাবনা হতে পারে, তবে এর মধ্যে প্রধান সমস্যাটি হ'ল যদি আমরা কখনও কমান্ডটিকে অন্য ভাষায় রূপান্তর করার সিদ্ধান্ত নিই তবে সবকিছু ভেঙে যায়।

শেবাংগুলি সুন্দরভাবে এই সমস্যাটি সমাধান করে।


39

প্রযুক্তিগতভাবে, পাইথনে এটি কেবল একটি মন্তব্য লাইনের।

এই লাইনটি কেবলমাত্র যদি আপনি শেল থেকে পাই ক্রিপ্টটি চালিত করেন (কমান্ড লাইন থেকে)। এটি " শেবাং " নামে পরিচিত ! , এবং এটি কেবল পাইথন স্ক্রিপ্টগুলির সাথে নয়, বিভিন্ন পরিস্থিতিতে ব্যবহার করা হয়।

এখানে, এটি শেলটিকে পাইথনের একটি নির্দিষ্ট সংস্করণ শুরু করতে (বাকী ফাইলটির যত্ন নিতে) নির্দেশ দেয়।


শেবাং একটি ইউনিক্স ধারণা। আপনি পাইথন লঞ্চার ইনস্টল করে থাকলে উইন্ডোজটিতেও এটি কাজ করে তা উল্লেখ করার মতো বিষয় হতে পারে py.exe। এটি একটি স্ট্যান্ডার্ড পাইথন ইনস্টলেশনের অংশ।
ফ্লোরিসালা

38

এটি করার প্রধান কারণ হ'ল অপারেটিং সিস্টেমের পরিবেশে স্ক্রিপ্টটি পোর্টেবলযোগ্য করে তোলা।

উদাহরণস্বরূপ মিংডাব্লুতে, পাইথন স্ক্রিপ্টগুলি ব্যবহার করে:

#!/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

2
ম্যাকোএসএক্সের অধীনে, এটিও রয়েছে /usr/bin/python। লিনাক্সের অধীনে, সিস্টেম দ্বারা ইনস্টল করা পাইথনটিও প্রায় নিশ্চিতভাবেই রয়েছে /usr/bin/python(আমি এর আগে আর কিছু দেখিনি এবং এর কোনও অর্থ হবে না)। মনে রাখবেন যে সিস্টেমগুলি নাও থাকতে পারে /usr/bin/env
অ্যালবার্ট

1
আপনার উপর ওএসএক্স হন এবং Homebrew ব্যবহার এবং তাদের ডিফল্ট ইনস্টলেশন সংক্রান্ত নির্দেশাবলী অনুসরণ করেন, এটি # অধীনে থাকব, / usr / স্থানীয় / bin / python-!
উইল

@ জিন-পলক্যাল্ডারোন: নীচে সাজের উত্তর দেখুন।
পাইডসাইনার

2018 বছরের জন্য আপডেট: বেয়ার pythonএটি পোর্টেবল নয়, এটি ডিস্ট্রিবিউশন ডিফল্ট পাইথন ইন্টারপ্রেটার। আর্ক লিনাক্স দীর্ঘ সময়ের জন্য পাইথন 3 এ ডিফল্ট রয়েছে এবং বিতরণগুলিও এটি নিয়ে ভাবতে পারে কারণ পাইথন 2 কেবলমাত্র 2020 পর্যন্ত সমর্থিত
mati865

22

সর্বাধিক মিস হওয়া একটি জিনিসের উপর জোর দেওয়া সম্ভবত বোধগম্য, যা তাত্ক্ষণিক বুঝতে আটকাতে পারে। আপনি যখন pythonটার্মিনাল টাইপ করেন আপনি সাধারণত একটি পূর্ণ পথ সরবরাহ করেন না। পরিবর্তে, এক্সিকিউটেবল আপ PATHপরিবেশের পরিবর্তনশীল মধ্যে সন্ধান করা হয়। ঘুরেফিরে , আপনি যখন পাইথন প্রোগ্রামটি সরাসরি চালনা করতে চান, তখন /path/to/app.pyঅবশ্যই শেলকে অবশ্যই কোন দোভাষী ব্যবহার করতে হবে তা ( হ্যাশবাংয়ের মাধ্যমে , অন্যান্য অবদানকারীরা উপরে কি ব্যাখ্যা করছে) must

হাশবাং একজন দোভাষীর পুরো পথ আশা করে । সুতরাং আপনার পাইথন প্রোগ্রামটি সরাসরি চালাতে আপনাকে পাইথন বাইনারিটির পুরো পথ সরবরাহ করতে হবে যা উল্লেখযোগ্যভাবে পরিবর্তিত হয়, বিশেষত ভার্চুয়ালেনভের ব্যবহার বিবেচনা করে । বহনযোগ্যতা মোকাবেলার জন্য ট্রিক /usr/bin/envব্যবহার করা হয়। পরেরটি মূলত পরিবেশে স্থান পরিবর্তন করতে এবং এটিতে একটি কমান্ড চালানোর উদ্দেশ্যে। যখন কোনও পরিবর্তন সরবরাহ করা হয় না এটি বর্তমান পরিবেশে কমান্ডটি চালায় যা কার্যকরভাবে একই PATHচেহারাতে কার্যকর হয় যা কৌশলটি করে।

ইউনিক্স স্ট্যাকেক্সচেঞ্জের উত্স


14

এটি একটি শেল কনভেনশন যা শেলকে জানায় যে প্রোগ্রামটি স্ক্রিপ্টটি কার্যকর করতে পারে।

#! / usr / বিন / এনভিভ পাইথন

পাইথন বাইনারি যাওয়ার পথে সমাধান করে।


12

এটি প্রস্তাবিত উপায়ে, ডকুমেন্টেশনে প্রস্তাবিত:

2.2.2। এক্সিকিউটেবল পাইথন স্ক্রিপ্টস

BSD'ish ইউনিক্স সিস্টেমে পাইথন স্ক্রিপ্টগুলি লাইন স্থাপন করে শেল স্ক্রিপ্টগুলির মতো সরাসরি নির্বাহযোগ্য করা যায়

#! /usr/bin/env python3.2

http://docs.python.org/py3k/tutorial/interpreter.html#executable-python-script থেকে


9

আপনি এই সমস্যাটি ভার্চুয়ালেনভ ব্যবহার করে দেখতে পারেন

এখানে টেস্ট.পি

#! /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

9

এটি কেবল আপনি কোন দোভাষী ব্যবহার করতে চান তা নির্দিষ্ট করে। এটি বুঝতে, টার্মিনালের মাধ্যমে একটি ফাইল তৈরি করুন 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 প্রিন্ট অপারেটরকে সমর্থন করে। সুতরাং, এখন আপনি কীভাবে স্ক্রিপ্ট ইন্টারপ্রেটারদের মধ্যে স্যুইচ করবেন তা শিখলেন।


9

আমার কাছে মনে হয় ফাইলগুলি সেই লাইন ছাড়াই চালাচ্ছে।

যদি তাই হয়, তবে সম্ভবত আপনি উইন্ডোজে পাইথন প্রোগ্রামটি চালাচ্ছেন? উইন্ডোজ সেই লাইনটি ব্যবহার করে না - পরিবর্তে ফাইল এক্সটেনশনের সাথে যুক্ত প্রোগ্রামটি চালাতে ফাইল-নাম এক্সটেনশন ব্যবহার করে।

তবে ২০১১ সালে, একটি "পাইথন লঞ্চার" তৈরি করা হয়েছিল যা উইন্ডোজের জন্য এই লিনাক্স আচরণের নকল করে (কিছুটা পরিমাণে)। এটি কেবল পাইথন ইন্টারপ্রেটারটি বেছে নেওয়ার ক্ষেত্রেই সীমাবদ্ধ - যেমন দুটি সিস্টেমে ইনস্টলড সিস্টেমে পাইথন 2 এবং পাইথন 3 এর মধ্যে নির্বাচন করা। ল্যাঞ্চারটি py.exeপাইথন ইনস্টলেশন হিসাবে optionচ্ছিকভাবে ইনস্টল করা হয়েছে এবং এটি .pyফাইলগুলির সাথে যুক্ত হতে পারে যাতে প্রবর্তক সেই লাইনটি পরীক্ষা করে দেখতে পারেন এবং পরিবর্তে নির্দিষ্ট পাইথন ইন্টারপ্রেটার সংস্করণটি চালু করে।


6
তিনি সম্ভবত ব্যবহার করছেন $ python myscript.py
সিনান Ünür

আমি লাইনটি না পেয়ে এবং পাইথন স্ক্রিপ্ট.পি ব্যবহার করে ভুল করেছিলাম এবং একদিন আমি সবেমাত্র ./myscript.py করেছি এবং সবকিছুই কাজ বন্ধ করে দিয়েছি, তখন সিস্টেমটি বুঝতে পেরে পাইথন স্ক্রিপ্টের পরিবর্তে ফাইলটিকে শেল স্ক্রিপ্ট হিসাবে দেখছে।
গুয়াগুয়া

8

এটি একটি "আসল" উত্তরের চেয়ে 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] হ্যাঁ, এবং কখনও কখনও লোকেরা এখনও এ জাতীয় জিনিসগুলি করে। এবং না, আমি আমার বেল্টে শালগম বা একটি পেঁয়াজ পরে নি।


5

আপনি যদি ভার্চুয়াল পরিবেশে আপনার স্ক্রিপ্টটি চালাচ্ছেন, বলুন venv, তারপরে which pythonকাজ করার সময় এক্সিকিউট করা venvপাইথন ইন্টারপ্রেটারের পথ প্রদর্শন করবে:

~/Envs/venv/bin/python

নোট করুন যে ভার্চুয়াল পরিবেশের নামটি পাইথন ইন্টারপ্রেটারের পথে এমবেড করা আছে mbed সুতরাং, আপনার স্ক্রিপ্টে এই পথটিকে হার্ডকোড করা দুটি সমস্যার কারণ হবে:

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

অতএব, জোনাথনের উত্তরে যুক্ত করার জন্য #!/usr/bin/env python, আদর্শ শেবাংটি কেবল ওএসের জুড়ে বহনযোগ্যতার জন্য নয়, ভার্চুয়াল পরিবেশেও বহনযোগ্যতার জন্য!


3

python2এবং এর মধ্যে পোর্টেবিলিটি সমস্যাগুলি বিবেচনা করে python3আপনার প্রোগ্রাম দুটির সাথে সামঞ্জস্য না করা অবধি আপনার সর্বদা দুটি সংস্করণ নির্দিষ্ট করা উচিত।

কিছু বিতরণ এখন কিছুক্ষণের জন্য pythonসিমলিংকড শিপিং python3করছে - pythonথাকার উপর নির্ভর করবেন না python2

এটি পিইপি 394 দ্বারা জোর দেওয়া :

প্ল্যাটফর্মগুলিতে পার্থক্য সহ্য করার জন্য, সমস্ত নতুন কোড যা পাইথন ইন্টারপ্রেটারকে আহ্বান করতে হবে সেগুলি পাইথন নির্দিষ্ট করে না, বরং পাইথন 2 বা পাইথন 3 (বা আরও নির্দিষ্ট পাইথন 2.x এবং পাইথন 3.x সংস্করণগুলি নির্দিষ্ট করে; মাইগ্রেশন নোটগুলি দেখুন ) । এই পার্থক্যটি শেবাংগুলিতে করা উচিত, যখন শেল স্ক্রিপ্ট থেকে প্রার্থনা করার সময়, সিস্টেমের মাধ্যমে () কল করার সময় বা অন্য কোনও প্রসঙ্গে প্রেরণ করা হয়।


2

এটি দোভাষীকে বলে যে অজগরটির কোন সংস্করণটি যখন আপনার কাছে পাইথনের একাধিক সংস্করণ রয়েছে তখন প্রোগ্রামটি চালাবেন।


0

এটি আপনাকে কার্যকর করতে সক্ষম যা আপনি ব্যবহার করতে চান তা নির্বাচন করতে অনুমতি দেয়; এটি খুব সহজ যদি আপনার একাধিক পাইথন ইনস্টল থাকে এবং প্রত্যেকটিতে আলাদা আলাদা মডিউল থাকে এবং চয়ন করতে চান। যেমন

#!/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())

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.