আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা একটি নির্দিষ্ট অজগর ইনস্টলেশন সহ চালানো দরকার। কোনও শেবাং কারুকাজ করার কোনও উপায় আছে যাতে এটি চালিত হয় $FOO/bar/MyCustomPython
?
আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা একটি নির্দিষ্ট অজগর ইনস্টলেশন সহ চালানো দরকার। কোনও শেবাং কারুকাজ করার কোনও উপায় আছে যাতে এটি চালিত হয় $FOO/bar/MyCustomPython
?
উত্তর:
শেবাং লাইনটি খুব সীমাবদ্ধ। অনেকগুলি ইউনিক্স ভেরিয়েন্টের অধীনে (লিনাক্স সহ) আপনার কেবল দুটি শব্দ থাকতে পারে: একটি আদেশ এবং একক যুক্তি। প্রায়শই দৈর্ঘ্যের সীমাবদ্ধতাও রয়েছে।
সাধারণ সমাধানটি হ'ল একটি ছোট শেল র্যাপার লিখুন। পাইথন স্ক্রিপ্টটির নাম দিন foo.py
এবং শেল স্ক্রিপ্টটি পাশে রেখে foo.py
কল করুন foo
। পাইথন স্ক্রিপ্টে এই পদ্ধতির কোনও নির্দিষ্ট শিরোনামের প্রয়োজন নেই।
#!/bin/sh
exec "$FOO/bar/MyCustomPython" "$0.py" "$@"
আরেকটি লোভনীয় পন্থা হ'ল উপরের মতো একটি মোড়ক স্ক্রিপ্ট লিখুন এবং #!/path/to/wrapper/script
পাইথন স্ক্রিপ্টে শেবাং লাইন হিসাবে রাখা । তবে, বেশিরভাগ ইউনিটগুলি শেবাং স্ক্রিপ্টগুলির শৃঙ্খলা সমর্থন করে না, সুতরাং এটি কাজ করবে না।
তাহলে MyCustomPython
ছিল $PATH
, আপনি ব্যবহার করতে পারে env
কীভাবে এটি দেখার:
#!/usr/bin/env MyCustomPython
import …
তবুও আরেকটি পদ্ধতি হ'ল স্ক্রিপ্ট উভয়ই একটি বৈধ শেল স্ক্রিপ্ট (যা সঠিক পাইথন ইন্টারপ্রেটার নিজের উপর চাপিয়ে দেয়) এবং লক্ষ্য ভাষায় একটি বৈধ স্ক্রিপ্ট (এখানে পাইথন) arrange এটির জন্য আপনার লক্ষ্য ভাষার জন্য এই জাতীয় দ্বৈত ভাষার স্ক্রিপ্ট লেখার কোনও উপায় খুঁজে পাওয়া দরকার। পার্লে, এটি হিসাবে পরিচিত if $running_under_some_shell
।
#!/bin/sh
eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}'
if $running_under_some_shell;
use …
পাইথনে একই প্রভাব অর্জনের একটি উপায়। শেলের মধ্যে "true"
হয় true
ইউটিলিটি যার আর্গুমেন্ট (দুই একক-অক্ষর স্ট্রিং উপেক্ষা করে :
এবং '
) এবং একটি সত্য মান ফেরায়। পাইথনে, "true"
একটি স্ট্রিং যা বুলিয়ান হিসাবে ব্যাখ্যা করার সময় সত্য হয়, সুতরাং এটি এমন একটি if
নির্দেশ যা সর্বদা সত্য এবং একটি স্ট্রিং আক্ষরিক প্রয়োগ করে।
#!/bin/sh
if "true" : '''\'
then
exec "$FOO/bar/MyCustomPython" "$0" "$@"
exit 127
fi
'''
import …
রোসটা কোডে অন্যান্য কয়েকটি ভাষায় এ জাতীয় দ্বি-ভাষার স্ক্রিপ্ট রয়েছে।
PYTHONPATH
এটিতে এমন কোনও সিস্টেমে সিজিআই স্ক্রিপ্টের জন্য একটি মানহীন অবস্থান থেকে মডিউল লোড করতে এনভির ভেরিয়েবল সম্পাদনা করতে ব্যবহার করেছি root জীবন রক্ষাকারী আবার ধন্যবাদ.
শেবাং লাইনগুলি পরিবর্তনশীল সম্প্রসারণের মধ্য দিয়ে যায় না, সুতরাং আপনি $FOO/MyCustomPython
এটি ব্যবহার করতে পারবেন না কারণ এটি ডলার-এফইও -... নামের এক্সিকিউটেবলের জন্য অনুসন্ধান করবে ..
বিকল্পটি হ'ল আপনার শেবাংকে শেল স্ক্রিপ্টের জন্য দোভাষী হিসাবে চিহ্নিত করা এবং এই শেল স্ক্রিপ্টটি সঠিক পরিবেশটি সনাক্ত করতে এবং এটি কার্যকর করতে পরিবেশ পরিবর্তনশীলগুলি ব্যবহার করতে পারে।
উদাহরণ: নিম্নলিখিত mypython.sh
লিখিত সামগ্রী সহ /usr/local/bin
(বা আপনার অন্য কোনও ডিরেক্টরিতে $PATH
) স্ক্রিপ্ট তৈরি করুন :
#! /bin/sh
PYTHON="$FOO/bar/MyCustomPython"
exec "$PYTHON" "$@"
তারপর আপনি একটি পাইথন স্ক্রিপ্ট মাধ্যমে মৃত্যুদন্ড কার্যকর করা আছে এই কুঁড়েঘর লাইন ব্যবহার করতে পারেন MyCustomPython
মাধ্যমে mypython.sh
:
#!/usr/bin/env mypython.sh
$python
নয়, ব্যবহার করুন , $PYTHON
আমরা এনভায়রনমেন্ট ভেরিয়েবল (প্যাগার, এডিটর, শেল ... $PYTHON
আপনার স্ক্রিপ্টে এনভায়রনমেন্ট ভেরিয়েবল নয়) এবং অভ্যন্তরীণ শেল ভেরিয়েবল (BASH_VERSION, RANDOM, ...) মূলধন করি। অন্যান্য সমস্ত পরিবর্তনশীল নামের কমপক্ষে একটি ছোট হাতের অক্ষর থাকা উচিত। এই কনভেনশনটি দুর্ঘটনাক্রমে পরিবেশগত এবং অভ্যন্তরীণ ভেরিয়েবলগুলি অগ্রাহ্য করে avo এছাড়াও, আপনার স্ক্রিপ্টগুলির জন্য এক্সটেনশনগুলি ব্যবহার করবেন না। স্ক্রিপ্টগুলি নতুন কমান্ডগুলির সংজ্ঞা দেয় যা আপনি চালাতে পারেন এবং আদেশগুলি সাধারণত এক্সটেনশন দেওয়া হয় না।
আপনি হয় কাস্টম পাইথন ইনস্টলেশন সম্পূর্ণরূপে পাথ ব্যবহার করতে পারেন, বা আপনি এটি $PATH
এবং ব্যবহার করতে পারেন #!/usr/bin/env [command]
। অন্যথায়, এর জন্য একটি মোড়ক লিখুন এবং exec
প্রক্রিয়া চিত্রটি প্রতিস্থাপন করতে ব্যবহার করুন , উদাহরণস্বরূপ:
#!/bin/bash
exec "$ENV/python" "$@"
প্রথমে আপনার পাইথনের সংস্করণটি ইতিমধ্যে ইনস্টল করা স্ট্যান্ডার্ড পাইথন থেকে কীভাবে পৃথক (উদাহরণস্বরূপ, একটি অতিরিক্ত মডিউল) এবং তারপরে প্রোগ্রামের শুরুতে 'সুইচ' কীভাবে পাইথন বলা হয় তা নির্ধারণ করুন:
#!/usr/bin/python
import os
import sys
try:
import MyCustomModule
except ImportError:
# only need to use expandvar if you know the string below has an envvar
custprog = os.path.expandvar("$FOO/bar/MyCustomPython")
os.execv(custprog, sys.argv) # call alternate python with the same arguments
raise SystemExit('could not call %s' % custprog)
# if we get here, then we have the correct python interpreter
এটি পাইথনের অন্য কোনও উদাহরণ দ্বারা প্রোগ্রামটি কল করার অনুমতি দেয়। আমি অন্তর্নির্মিত এসকিএল লাইব্রেরির সাথে উদাহরণের জন্য অনুরূপ কিছু করি যা সিস্টেমের অজগরটিতে মডিউল হিসাবে আমদানি করা যায় না।
তোমাদের স্থলাভিষিক্ত করতে পারেন $FOO
মধ্যে $FOO/bar/MyCustomPython
কংক্রিট পথ বিকল্প সহ আপনি বলতে পারেন env
কুঁড়েঘর লাইন যেখানে সরাসরি একটি কাস্টম সেটিং দ্বারা আপনার কাস্টম পাইথন সংস্করণ সন্ধান করার PATH
এতে।
#!/usr/bin/env PATH="/path1/to/MyCustomPython:/path2/to/MyCustomPython" python
সম্পাদনা করুন : কেবলমাত্র PATH মান অ্যাসাইনমেন্টের চারপাশে উদ্ধৃতিবিহীন কাজ করা মনে হচ্ছে:
#!/usr/bin/env PATH=/path1/to/MyCustomPython:/path2/to/MyCustomPython python
PATH
:PATH=$PATH:/path/to/whatever...