virtualenv এ পরিবেশের পরিবর্তনশীল নির্ধারণ করা


160

আমার একটি হেরোকু প্রকল্প রয়েছে যা এর কনফিগারেশনটি পেতে পরিবেশের ভেরিয়েবল ব্যবহার করে তবে আমি স্থানীয়ভাবে আমার অ্যাপ্লিকেশনটি পরীক্ষা করতে প্রথমে ভ্যুচুয়ালেনভ ব্যবহার করি।

ভার্চুয়ালেনভের অভ্যন্তরে রিমোট মেশিনে পরিবেশের পরিবর্তনগুলি নির্ধারণ করার কোনও উপায় আছে কি?

উত্তর:


106

হালনাগাদ

17 ই মে 2017 পর্যন্ত অটোয়েনভের রিডএমই জানিয়েছে যে ডায়রনভ সম্ভবত আরও ভাল বিকল্প এবং এর দ্বারা বোঝা যায় যে অটোএনভ আর রক্ষণাবেক্ষণ করা হবে না।

পুরানো উত্তর

আমি ঠিক এটি করতে অটোএনভ লিখেছি:

https://github.com/kennethreitz/autoenv


12
খুব মজার gif: ডি
চাচন

3
কেবল এফওয়াইআই মনে হয় যে .envফাইলগুলি বোরক হেরোকু অন্তত আমার অভিজ্ঞতায় তৈরি করে। সুতরাং এটি আপনার রেপোতে অন্তর্ভুক্ত করবেন না। দীর্ঘ সময় ব্যবহারকারী / অটেনভ বিটিডব্লিউর বিশাল ফ্যান। হাই কেনেথ, আপনি দা মানুষ!
গ্যালান্ট

এই উত্তরটি সম্পাদনার পরেও কি প্রাসঙ্গিক? কি দ্বারা প্রস্তাবিত সমাধান সম্পর্কে আপনার মতামত কি Nagasaki45 & TheLetterN
ফ্রিজ হইয়া গেল

288

যদি আপনি ব্যবহার করছেন virtualenvwrapper (আমি অত্যন্ত করার সুপারিশ করছি), আপনি বিভিন্ন আঙ্গুলসমূহ (preactivate, postactivate, predeactivate, postdeactivate) এ একই নামের স্ক্রিপ্ট ব্যবহার নির্ধারণ করতে পারবেন $VIRTUAL_ENV/bin/। আপনার পোস্টঅ্যাকটিভেট হুক দরকার।

$ workon myvenv

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export DJANGO_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret

$ echo $DJANGO_DEBUG
True

আপনি যদি এই প্রকল্পটি আপনার ডিরেক্টরি ডিরেক্টরিতে রাখতে চান তবে কেবল আপনার প্রকল্প ডিরেক্টরি থেকে একটি সিমলিংক তৈরি করুন $VIRTUAL_ENV/bin/postactivate

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate

এমনকি আপনি প্রতিবার mkvirtualenv ব্যবহার করার সময় সিমলিঙ্কগুলি তৈরি করতে স্বয়ংক্রিয় করতে পারেন ।

নিষ্ক্রিয় উপর পরিষ্কার করা

মনে রাখবেন যে এটি নিজের পরে পরিষ্কার হবে না। আপনি যখন ভার্চুয়ালেনভ নিষ্ক্রিয় করবেন তখন পরিবেশের পরিবর্তনশীলটি বজায় থাকবে। প্রতিসামান্যভাবে পরিষ্কার করতে আপনি এতে যুক্ত করতে পারেন $VIRTUAL_ENV/bin/predeactivate

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG

$ deactivate

$ echo $DJANGO_DEBUG

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

সেটআপ:

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
    export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=apple

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
    export SOME_VAR=$SOME_VAR_BACKUP
    unset SOME_VAR_BACKUP
else
    unset SOME_VAR
fi

টেস্ট:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana

কেবলমাত্র একটি নির্ভুলতা: করা ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivateআমার পক্ষে কাজ করে না। lnএকটি পূর্ণ পথ চায়, তাই আমাকে করতে হয়েছিলln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
জোনুর

@ জোনিউর আপনি কি ওএস চালু করছেন? লিনাক্সের আওতায় আপেক্ষিক পাথ কাজ করে ln
ড্যানিলো বার্গেন

@ ড্যানিলোবার্গেন আমি লিনাক্সমিন্ট ৩.২.০ ব্যবহার করি। এই উত্তরটি বলেছে যে lnপুরো পথ পছন্দ করে তাই আমি এটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে। আমি যখন catআপেক্ষিক পাথের সাথে সিমলিংকের চেষ্টা করেছি তখন তা বলেছিল No such file or directory
জোনুর

@ ডিপিউরাসেল, এটি প্রায় পর্যালোচনার মাধ্যমে তৈরি করেনি, এটি একটি ভাল সংযোজন, তবে এটি এত তাৎপর্যপূর্ণভাবে এটি তার নিজস্ব পোস্ট হিসাবে তৈরি করা যেতে পারে (যা আপনাকে কিছু সমালোচনা করতে পারত)। প্রচুর ভাল উত্তর ভাল আছে :)
কেন্ট ফ্রেড্রিক

2
এবং উত্স নিয়ন্ত্রণ? এটি কীভাবে ক্লোনিং করে এমন একটি প্রকল্প স্থাপন করে যাতে এনভির প্রয়োজন। var.s?

44

আপনি চেষ্টা করতে পারেন:

export ENVVAR=value

virtualenv_root / বিন / সক্রিয় করুন। মূলত অ্যাক্টিভেট স্ক্রিপ্টটিই যখন কার্যকর হয় যখন আপনি ভার্চুয়ালেনভ ব্যবহার শুরু করেন আপনি নিজের কাস্টমাইজেশনটি সেখানে রেখে দিতে পারেন।


2
নিশ্চিত না যে এটি যথেষ্ট পরিষ্কার তবে নিশ্চিতভাবে কাজ করে!
চাচন

2
হ্যাঁ, এটি সস্তা এবং কদর্য, তবে মাঝে মাঝে এটি আপনার প্রয়োজন।
মাইকেল শ্যাপার

1
আমি এটির প্রস্তাব দিচ্ছি না, আমি এটি করেছি এবং কিছুক্ষণ পরে সমস্ত অ্যাক্টিভেট স্ক্রিপ্টগুলি (সক্রিয় করুন, অ্যাক্টিভেট.সি.এস., অ্যাক্টিভেট.ফিশ) স্বয়ংক্রিয়ভাবে ওভাররাইট হয়ে গিয়েছিল তাই আমি আমার পরিবর্তনটি হারিয়ে ফেললাম। পোস্টঅ্যাকটিভেট এবং প্রি-অ্যাক্টিভেট ব্যবহার করুন।
wil93


deactivateসেটিং এবং আনসেটিংয়ের ভারসাম্য সংজ্ঞায়িত ভার্চুয়ালেনভ_রূট / বিন / অ্যাক্টিভেটে ফাংশনটিতে 'আনসেট ENVVAR' যুক্ত করতে পারত
লু জেল

42

ব্যবহার করে শুধুমাত্র virtualenv (ছাড়া virtualenvwrapper ), এনভায়রনমেন্ট ভেরিয়েবলের মান স্থাপনার মাধ্যমে সহজ activateস্ক্রিপ্ট আপনি virtualenv সক্রিয় করার গুন।

চালান:

nano YOUR_ENV/bin/activate

ফাইলের শেষে পরিবেশের ভেরিয়েবলগুলি যুক্ত করুন:

export KEY=VALUE

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


9
আরও অনেক বুদ্ধিমান পদ্ধতির আইএমও। ওভাররাইডিং cdশুধু পরিবেশের ভেরিয়েবল আছে? কাঁপুন
মিশেল মুলার

নিষ্ক্রিয় হওয়ার পরে কীভাবে পরিষ্কার করবেন?
বুঁচিস

36

এখানে অনেক সুন্দর উত্তর থাকার পরেও virtualenv, আমি এমন কোনও পোস্ট পোস্ট করে দেখলাম না যে দুটোই নিষ্ক্রিয় করার সময় পরিবেশের পরিবর্তনগুলি অন্তর্ভুক্ত করে এবং এর বাইরে অতিরিক্ত লাইব্রেরিগুলির প্রয়োজন হয় না , সুতরাং এখানে আমার সমাধানটিতে কেবল সম্পাদনা / বিন / সক্রিয়করণ জড়িত রয়েছে, এটি ব্যবহার করে পরিবর্তনশীল MY_SERVER_NAMEএবং MY_DATABASE_URLউদাহরণ হিসাবে:

অ্যাক্টিভেট স্ক্রিপ্টে নিষ্ক্রিয় হওয়ার জন্য একটি সংজ্ঞা থাকতে হবে, এবং আপনি এর শেষে আপনার ভেরিয়েবলগুলি আনসেট করতে চান:

deactivate () {
    ...

    # Unset My Server's variables
    unset MY_SERVER_NAME
    unset MY_DATABASE_URL
}

সক্রিয় স্ক্রিপ্টের শেষে, ভেরিয়েবলগুলি সেট করুন:

# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"

এটি কাজ করার জন্য আপনাকে আর কিছু ইনস্টল করতে হবে না এবং যখন আপনি deactivateভার্চুয়ালেনভ করবেন তখন আপনার ভেরিয়েবলগুলি বাকী থাকবে না।


3
আমি এই পদ্ধতির পছন্দ করি কারণ আমি বাহ্যিক libs বা অ্যাপ্লিকেশন চাই না তবে এর সাথে সমস্যা হ'ল আপনি যদি পরিবেশটি পুনর্নির্মাণ করেন তবে আপনার সমস্ত সেটিংস আলগা হয়ে যাবে।
ভিএসটাইভক

2
এই পদ্ধতির সুবিধা হ'ল সেটআপের গতি এবং যাদুবিদ্যার অভাব। পরিবেশের ভেরিয়েবলগুলি উত্স নিয়ন্ত্রণের বাইরে রাখা পরিবেশের পুনর্নির্মাণের সময় আপনাকে সর্বদা আপনার গোপনীয়তা / সেটিংসকে ধ্বংস করার সমস্যার দিকে নিয়ে যায়।
অ্যান্টনি ম্যানিং-ফ্র্যাঙ্কলিন

এই কাজ করার জন্য ভ্যুচুয়ালেনভ ডিরেক্টরিটি কি সংগ্রহস্থলটিতে পরীক্ষা করা হবে? ভেরিয়েবলগুলি এমন গোপনীয় জিনিস রাখে যা আপনি রেপোতে চান না? আপনি কিভাবে এটি পরিচালনা করবেন?
কাঠামো

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

18

স্থানীয়ভাবে একটি ভার্চুয়ালেনভের মধ্যে দুটি পরীক্ষা রয়েছে যা আপনি এটি পরীক্ষা করতে ব্যবহার করতে পারেন। প্রথমটি হ'ল হিরোকু টুলবেল্ট (https://toolbelt.heroku.com/) এর মাধ্যমে ইনস্টল করা একটি সরঞ্জাম। হাতিয়ারটি ফোরম্যান। এটি আপনার সমস্ত পরিবেশের ভেরিয়েবলগুলি রফতানি করবে যা স্থানীয়ভাবে একটি .env ফাইলে সংরক্ষণ করা হয় এবং তারপরে আপনার প্রোফাইলে অ্যাপ্লিকেশন প্রক্রিয়া চালায়।

আপনি যদি একটি হালকা পদ্ধতির সন্ধান করেন দ্বিতীয় উপায়টি হল স্থানীয়ভাবে একটি .env ফাইল রাখার পরে চালনা করুন:

export $(cat .env)

6

হয় দ্বারা autoenv ইনস্টল করুন

$ pip install autoenv

(বা)

$ brew install autoenv

এবং তারপরে .envআপনার ভার্চুয়ালেনভ প্রকল্প ফোল্ডারে ফাইল তৈরি করুন

$ echo "source bin/activate" > .env

এখন সবকিছু ঠিকঠাক কাজ করে।


3

আপনি যদি ইতিমধ্যে হেরোকু ব্যবহার করে থাকেন তবে ফোরম্যানের মাধ্যমে আপনার সার্ভারটি চালানোর বিষয়ে বিবেচনা করুন । এটি এমন কোনও .envফাইলকে সমর্থন করে যা KEY=VALএটি চালানোর আগে আপনার অ্যাপ্লিকেশনে রফতানি করা হবে কেবল সেই লাইনের একটি তালিকা ।


3

এটি জাঙ্গোর জন্য নকশাকৃতভাবে তৈরি করার আরেকটি উপায়, তবে বেশিরভাগ সেটিংসে কাজ করা উচিত, তা হচ্ছে জাঙ্গো-ডোটেনভ ব্যবহার।

  • আসল - https://github.com/jacobian/django-dotenv
  • আরও সম্পূর্ণরূপে বৈশিষ্ট্যযুক্ত কাঁটাচামচ- https://github.com/tedtieken/django-dotenv-rw (আমি আমার স্থানীয় কমান্ড লাইন থেকে আমার রিমোট .env সেটিংস ওয়েবফ্যাশনে সেট করতে সক্ষম হতে এটি লিখেছিলাম, হিরকু আমাকে লুণ্ঠন করেছে)

1

envডিরেক্টরিতে ভার্চুয়ালেনভকে সক্রিয় করতে এবং .envব্যবহৃত সঞ্চিত এনভিন্রোমেন্ট ভেরিয়েবলগুলি রফতানি করতে:

source env/bin/activate && set -a; source .env; set +a

সাথে এলিয়াসে সংরক্ষণ করুনecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
ড্যানিল মাশকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.