কীভাবে ভার্চুয়ালনেভকে বাশ স্ক্রিপ্টে সক্রিয় করা যায়


106

পাইথন ভার্চুয়ালেনভকে সক্রিয় করতে আপনি কীভাবে বাশ স্ক্রিপ্ট তৈরি করবেন?

আমার একটি ডিরেক্টরি কাঠামো রয়েছে:

.env
    bin
        activate
        ...other virtualenv files...
src
    shell.sh
    ...my code...

আমি আমার ভার্চুয়ালেনভ দ্বারা সক্রিয় করতে পারি:

user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$

তবে, বাশ স্ক্রিপ্ট থেকে এটি করা কিছুই করে না:

user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$ 

আমি কি ভুল করছি?


6
যখন আপনি শেল স্ক্রিপ্টটি চালান আপনি আসলে একটি নতুন শেল তৈরি করছেন। ব্যবহারের sourceবিষয়টি হ'ল বর্তমান শেলটিতে কিছু পরিবর্তন করা। আপনি পুরো পথটি ব্যবহার করে ভার্চুয়ালেনভের অজগর ব্যবহার করতে পারেন ./env/bin/python
পাবলো নাভারো

@ নাগুরেনিগা, না, প্রশ্নটি আমার মতো নয় the তারা জিজ্ঞাসা করছেন একটি স্বেচ্ছাসেবক অবস্থান থেকে উত্স কিভাবে। আমি এটি ইতিমধ্যে জানি। আমি জিজ্ঞাসা করছি কীভাবে কোনও কাস্টম বাশ স্ক্রিপ্টের মধ্যে উত্স উত্স এবং উত্স বজায় রাখা যায়।
সেরিন

উত্তর:


84

আপনি উত্স যখন, আপনি সক্রিয় স্ক্রিপ্ট আপনার সক্রিয় শেল মধ্যে লোড করা হয়।

আপনি যখন এটি কোনও স্ক্রিপ্টে করেন, আপনি এটিকে সেই শেলের মধ্যে লোড করুন যা আপনার স্ক্রিপ্টটি শেষ হওয়ার পরে উপস্থিত হয় এবং আপনি আপনার আসল, নিষ্ক্রিয় শেলটিতে ফিরে আসবেন।

আপনার সেরা বিকল্পটি কোনও ফাংশনে এটি করা

activate () {
  . ../.env/bin/activate
}

বা একটি উপনাম

alias activate=". ../.env/bin/activate"

আশাকরি এটা সাহায্য করবে.


উইন্ডোজের জন্য সি: \ টিউটোরিয়াল> \
এনভিভি

7
আমার উত্সটি যখন ছিল তখন কী ঘটেছিল তা আমার একেবারেই ধারণা ছিল না এটি আমার বাশ স্ক্রিপ্টিংটি আরও ভালভাবে বদলেছে। ধন্যবাদ!
রবার্ট টাউনলি

4
আপনার ওরফে ধারণাটি আমার পক্ষেও সুন্দরভাবে কাজ করেছে। কেবল একটি নোট: এটি কাজ করার জন্য আমাকে আমার .zshrc স্ক্রিপ্টে (বা বাশ ব্যবহারকারীদের জন্য .bashrc) এটি (ওরফে abcdef = "উত্স ... / বিন / অ্যাক্টিভেট") রাখতে হয়েছিল had
শাহিনগুলি

যদি আপনার ডিফল্ট ফোল্ডারটির নাম ব্যবহার করে আপনার ভার্চুয়াল্যানভ থাকে তবে এটি একটি দুর্দান্ত সমাধান। আমি ফোল্ডারে একাধিক রেপো ব্যবহার করতাম, ভ্যুচুয়ালেভগুলিতে গোলমাল করতাম। আমি এখন এই ডিফল্টে স্যুইচ করেছি।
3manuek

4
আমি বাশ ইত্যাদিতে বেশ নতুন you আপনি কি এই উদাহরণটি প্রসারিত করতে পারেন যাতে এটি সম্পূর্ণ স্ক্রিপ্টটি দেখায়?
অ্যালজোস্ট

60

উত্স ব্যবহার করে আপনার বাশ স্ক্রিপ্ট কল করা উচিত।

এখানে একটি উদাহরণ:

#!/bin/bash
# Let's call this script venv.sh
source "<absolute_path_recommended_here>/.env/bin/activate"

আপনার শেল এ ঠিক এটি কল করুন:

> source venv.sh

বা যেমন @ আউটমাইন্ড পরামর্শ দিয়েছে: (দ্রষ্টব্য যে এটি zsh এর সাথে কাজ করে না)

> . venv.sh

আপনি সেখানে যান, শেল ইঙ্গিতটি আপনার প্রম্পটে রাখা হবে।


4
বা এমনকি শুধু "। venv.sh"
outmind

আমি যাই চেষ্টা করি না কেন, এটি source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"উত্পন্ন করে:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found

আমি যখন which sourceশেল প্রম্পটে টাইপ করি তখনও আমি কিছুই পাই না , তবুও, source venv3/bin/activateআমি যা প্রত্যাশা করি এবং ভেন্টটি খোলাম তা করি। ...

কেন এটি কাজ করে তবে source ./env/bin/activate(একই #!/bin/bashউপসর্গ সহ) কাজ করে না? কোট ব্যবহার করে না পার্থক্য কি?
কৃষ্ণসার

উদ্ধৃতি ব্যতীত স্ক্রিপ্টের অভ্যন্তর উত্সটি ব্যবহার করতে আমার কোনও সমস্যা নেই। আমি সমস্যাটি দেখতে পাচ্ছি source ./env/bin/activateকারণ এটি আপনি যে পথে চালাচ্ছেন তার সাথে এটি আপেক্ষিক? আপনি যদি স্ক্রিপ্টের ভিতরে ডিরেক্টরিটি পরিবর্তন করেন তবে আপেক্ষিকভাবে যেতে পারেন।
ফ্ল্যাভিও গার্সিয়া

14

যদিও এটি শেল প্রম্পটে "(.env)" উপসর্গ যোগ করে না, আমি এই স্ক্রিপ্টটি প্রত্যাশার মতো কাজ করে দেখলাম।

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"

যেমন

user@localhost:~/src$ which pip
/usr/local/bin/pip
user@localhost:~/src$ which python
/usr/bin/python
user@localhost:~/src$ ./shell
user@localhost:~/src$ which pip
~/.env/bin/pip
user@localhost:~/src$ which python
~/.env/bin/python
user@localhost:~/src$ exit
exit

4
প্রযুক্তিগতভাবে আপনি একটি সাবস্কেল তৈরি করছেন। এটি অগত্যা কোনও সমস্যা নয়, তবে ওপিটির জন্য আপনার এটি বানান করা উচিত।
সমৃদ্ধ

এটি কাজ করে, তবে আমাকে আগে আমার "সক্রিয়" ফাইলটির অনুমতি দিতে হয়েছিল।
অ্যাড্রিয়ান লোপেজ

4
এটি 2019 সালে কাজ করে! ম্যাকোসে আমাকে সবেমাত্র/bin/bash/usr/bin/env bash
16

2020 সালে উবুন্টু 18.04 এডাব্লুএস ইসি 2 তে কাজ করে I আমি ভাবছি আমি একই যুক্তিটি ব্যবহার করে কীভাবে নিষ্ক্রিয় করব?
সিএসএফ জুনিয়র

আপনি deactivateসাবটিহেল থেকে exitবা Ctrl + d
অ্যালেক্সেক্স রোচে

10

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

যদি আপনার উদ্দেশ্যটি হ'ল ভার্চুয়ালেনভে শেল কমান্ডগুলি চালানো হয় তবে আপনি সক্রিয় স্ক্রিপ্টটি সস করার পরে আপনার স্ক্রিপ্টে এটি করতে পারেন। যদি আপনার উদ্দেশ্যটি ভ্যুচুয়ালেনভের অভ্যন্তরে একটি শেলের সাথে ইন্টারেক্ট করা হয় তবে আপনি আপনার স্ক্রিপ্টের অভ্যন্তরে একটি সাব-শেল দিতে পারেন যা পরিবেশের উত্তরাধিকারী হবে।


3

এখানে আমি প্রায়শই স্ক্রিপ্টটি ব্যবহার করি। এটি হিসাবে চালান$ source script_name

#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
    . $PWD/venv/bin/activate
}

activate

2

কি জন্য বাশ স্ক্রিপ্ট উত্সাহ?

  1. আপনি যদি একাধিক ভ্যুচুয়ালেভগুলির মধ্যে স্যুইচ করতে চান বা একটি ভার্চুয়ালেনভ দ্রুত প্রবেশ করেন, আপনি কি চেষ্টা করেছেন virtualenvwrapper? মনে হচ্ছে utils অনেকটা প্রদান করে workon venv, mkvirtualenv venvইত্যাদি।

  2. যদি আপনি কিছু নির্দিষ্ট ভার্চুয়ালেনভে কেবল অজগর স্ক্রিপ্টটি /path/to/venv/bin/python script.pyচালান তবে এটি চালানোর জন্য ব্যবহার করুন ।


আসলে, আমি workon ...বাশ স্ক্রিপ্ট থেকে কল করতে চাই । (কারণ আমি এটির প্রারম্ভিক সময়ে পরবর্তী সময়ে আরও স্টাটাক্ট চালাতে চাই)) তবে এটি কার্যকর করার কোনও উপায় খুঁজে পাচ্ছি না।
ড্যানিয়েল বি

1

আপনি নিজের ব্যবহারটি আরও ভালভাবে ধারণ করতে সাব-শেল ব্যবহার করে এটি করতে পারেন - এখানে একটি ব্যবহারিক উদাহরণ রয়েছে:

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
# NOTE
#  - PATH is only modified as an example
#  - output beyond a single value may not be captured without quoting
#  - it is important to discard (or separate) virtualenv activation stdout
#    if the stdout of commandB is to be captured
#
VAR=$(
    PATH="/opt/bin/foo:$PATH"
    . /path/to/activate > /dev/null  # activate virtualenv
    commandB  # tool from /opt/bin/ which requires virtualenv
)

# Use the output from commandB later
commandC "$VAR"

এই শৈলী বিশেষত যখন সহায়ক

  • এর ভিন্ন সংস্করণ commandAবা এর commandCঅধীনে বিদ্যমান/opt/bin
  • commandBসিস্টেমে বিদ্যমান PATHবা খুব সাধারণ
  • এই কমান্ডগুলি ভার্চুয়ালেনভের অধীনে ব্যর্থ হয়
  • একের জন্য বিভিন্ন ধরণের ভার্চুয়াল্যানভ দরকার হয়

ডাবল উদ্ধৃতি দিতে ভুলবেন না $(...)বা আপনি আউটপুটে থাকা ফাঁকা স্থান এবং ট্যাবগুলি হারিয়ে যাবেন।
এরিক

"${VAR}"কঠোরভাবে সমতুল্য হয় "$VAR"আপনি শেল ভেরিয়েবল প্রায় কোঁকড়া বন্ধনী প্রয়োজন হবে না কারণ উদ্ধৃতি চিহ্ন আসলে আরো শক্তিশালী হয়। উদাহরণস্বরূপ মডিফায়ার ব্যবহার করার সময় ব্যতিক্রমটি হল"${VAR:-default_value}"
এরিক

PATH=$PATH:/opt/binফাঁকা স্থান এবং ট্যাবগুলির সাথে পাথ পরিচালনা করার জন্য যথাযথ উদ্ধৃতি দরকার।
এরিক

@ এরিক ধন্যবাদ, যদিও আপনি editনীচের পোস্টগুলিতে পরিবর্তনের পরামর্শ দেওয়ার জন্য বোতামটি ব্যবহার করতে পারেন ! আরও, এটি জানা যাক যে এটি প্রায়শই একটি প্রয়োজনীয়তা এবং সুরক্ষার জন্য গুরুত্বপূর্ণ, যে কেউ বুদ্ধিমানভাবে IFSচরগুলি যুক্ত করে PATHসে সন্ত্রাসী।
ti7

0

আপনার এক লাইনে একাধিক কমান্ড ব্যবহার করা উচিত। উদাহরণ স্বরূপ:

os.system(". Projects/virenv/bin/activate && python Projects/virenv/django-project/manage.py runserver")

যখন আপনি আপনার ভার্চুয়াল পরিবেশটি এক লাইনে সক্রিয় করবেন, আমি মনে করি এটি অন্যান্য কমান্ড লাইনের জন্য ভুলে যায় এবং আপনি এক লাইনে একাধিক কমান্ড ব্যবহার করে এটি প্রতিরোধ করতে পারেন। এটি আমার জন্য কাজ করেছে :)


0

আমি যখন ভেন্ট শিখছিলাম তখন কীভাবে এটি সক্রিয় করা যায় তা স্মরণ করিয়ে দেওয়ার জন্য আমি একটি স্ক্রিপ্ট তৈরি করেছি।

#!/bin/sh
# init_venv.sh
if [ -d "./bin" ];then
  echo "[info] Ctrl+d to deactivate"
  bash -c ". bin/activate; exec /usr/bin/env bash --rcfile <(echo 'PS1=\"(venv)\${PS1}\"') -i"
fi

এটির সুবিধাটি এটি প্রম্পটে পরিবর্তন করে।

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