আমি কীভাবে আমার শেবাং-এ পরিবেশের পরিবর্তনগুলি ব্যবহার করতে পারি?


34

আমার কাছে পাইথন স্ক্রিপ্ট রয়েছে যা একটি নির্দিষ্ট অজগর ইনস্টলেশন সহ চালানো দরকার। কোনও শেবাং কারুকাজ করার কোনও উপায় আছে যাতে এটি চালিত হয় $FOO/bar/MyCustomPython?

উত্তর:


29

শেবাং লাইনটি খুব সীমাবদ্ধ। অনেকগুলি ইউনিক্স ভেরিয়েন্টের অধীনে (লিনাক্স সহ) আপনার কেবল দুটি শব্দ থাকতে পারে: একটি আদেশ এবং একক যুক্তি। প্রায়শই দৈর্ঘ্যের সীমাবদ্ধতাও রয়েছে।

সাধারণ সমাধানটি হ'ল একটি ছোট শেল র‌্যাপার লিখুন। পাইথন স্ক্রিপ্টটির নাম দিন 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 

রোসটা কোডে অন্যান্য কয়েকটি ভাষায় এ জাতীয় দ্বি-ভাষার স্ক্রিপ্ট রয়েছে।


1
@ ক্রিস: সবকিছুই একক উদ্ধৃতির অভ্যন্তরে। দয়া করে ব্যাখ্যা করুন ...
স্টাফেন গিমেনেজ

1
আপনি একটি রক্তাক্ত উইজার্ড ... এটি দুর্দান্ত। আমি PYTHONPATHএটিতে এমন কোনও সিস্টেমে সিজিআই স্ক্রিপ্টের জন্য একটি মানহীন অবস্থান থেকে মডিউল লোড করতে এনভির ভেরিয়েবল সম্পাদনা করতে ব্যবহার করেছি root জীবন রক্ষাকারী আবার ধন্যবাদ.
wspurgin

12

শেবাং লাইনগুলি পরিবর্তনশীল সম্প্রসারণের মধ্য দিয়ে যায় না, সুতরাং আপনি $FOO/MyCustomPythonএটি ব্যবহার করতে পারবেন না কারণ এটি ডলার-এফইও -... নামের এক্সিকিউটেবলের জন্য অনুসন্ধান করবে ..

বিকল্পটি হ'ল আপনার শেবাংকে শেল স্ক্রিপ্টের জন্য দোভাষী হিসাবে চিহ্নিত করা এবং এই শেল স্ক্রিপ্টটি সঠিক পরিবেশটি সনাক্ত করতে এবং এটি কার্যকর করতে পরিবেশ পরিবর্তনশীলগুলি ব্যবহার করতে পারে।

উদাহরণ: নিম্নলিখিত mypython.shলিখিত সামগ্রী সহ /usr/local/bin(বা আপনার অন্য কোনও ডিরেক্টরিতে $PATH) স্ক্রিপ্ট তৈরি করুন :

#! /bin/sh
PYTHON="$FOO/bar/MyCustomPython"
exec "$PYTHON" "$@"

তারপর আপনি একটি পাইথন স্ক্রিপ্ট মাধ্যমে মৃত্যুদন্ড কার্যকর করা আছে এই কুঁড়েঘর লাইন ব্যবহার করতে পারেন MyCustomPythonমাধ্যমে mypython.sh:

#!/usr/bin/env mypython.sh

6
কনভেনশন অনুসারে $pythonনয়, ব্যবহার করুন , $PYTHONআমরা এনভায়রনমেন্ট ভেরিয়েবল (প্যাগার, এডিটর, শেল ... $PYTHONআপনার স্ক্রিপ্টে এনভায়রনমেন্ট ভেরিয়েবল নয়) এবং অভ্যন্তরীণ শেল ভেরিয়েবল (BASH_VERSION, RANDOM, ...) মূলধন করি। অন্যান্য সমস্ত পরিবর্তনশীল নামের কমপক্ষে একটি ছোট হাতের অক্ষর থাকা উচিত। এই কনভেনশনটি দুর্ঘটনাক্রমে পরিবেশগত এবং অভ্যন্তরীণ ভেরিয়েবলগুলি অগ্রাহ্য করে avo এছাড়াও, আপনার স্ক্রিপ্টগুলির জন্য এক্সটেনশনগুলি ব্যবহার করবেন না। স্ক্রিপ্টগুলি নতুন কমান্ডগুলির সংজ্ঞা দেয় যা আপনি চালাতে পারেন এবং আদেশগুলি সাধারণত এক্সটেনশন দেওয়া হয় না।
ক্রিস ডাউন

4

আপনি হয় কাস্টম পাইথন ইনস্টলেশন সম্পূর্ণরূপে পাথ ব্যবহার করতে পারেন, বা আপনি এটি $PATHএবং ব্যবহার করতে পারেন #!/usr/bin/env [command]। অন্যথায়, এর জন্য একটি মোড়ক লিখুন এবং execপ্রক্রিয়া চিত্রটি প্রতিস্থাপন করতে ব্যবহার করুন , উদাহরণস্বরূপ:

#!/bin/bash
exec "$ENV/python" "$@"

3

প্রথমে আপনার পাইথনের সংস্করণটি ইতিমধ্যে ইনস্টল করা স্ট্যান্ডার্ড পাইথন থেকে কীভাবে পৃথক (উদাহরণস্বরূপ, একটি অতিরিক্ত মডিউল) এবং তারপরে প্রোগ্রামের শুরুতে 'সুইচ' কীভাবে পাইথন বলা হয় তা নির্ধারণ করুন:

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

এটি পাইথনের অন্য কোনও উদাহরণ দ্বারা প্রোগ্রামটি কল করার অনুমতি দেয়। আমি অন্তর্নির্মিত এসকিএল লাইব্রেরির সাথে উদাহরণের জন্য অনুরূপ কিছু করি যা সিস্টেমের অজগরটিতে মডিউল হিসাবে আমদানি করা যায় না।


0

তোমাদের স্থলাভিষিক্ত করতে পারেন $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

5
সাবধান থাকুন যে এটি সমস্ত ইউনিক্স রূপগুলিতে কাজ করে না (যেমন লিনাক্সে নয়)। এবং আপনি पथ থেকে সমস্ত বিদ্যমান ডিরেক্টরি মুছে ফেলছেন, যার ফলে লাইনটিতে সমস্যা দেখা দিতে পারে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
এর চেয়ে আরও ভাল প্রসারিত করুন PATH:PATH=$PATH:/path/to/whatever...
বেংট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.