পাইথন স্ক্রিপ্ট সহ ভার্চুয়ালেনভ সক্রিয় করুন


91

আমি পাইথন স্ক্রিপ্ট থেকে একটি ভার্চুয়ালেনভ উদাহরণ সক্রিয় করতে চাই।

আমি জানি এটি করা বেশ সহজ, তবে আমি যে সমস্ত উদাহরণ দেখেছি সেগুলি এনভির অভ্যন্তরে কমান্ড চালাতে এবং তারপরে সাবপ্রসেসটি বন্ধ করতে ব্যবহার করে।

আমি কেবল ভার্চুয়ালেনভকে সক্রিয় করতে এবং শেলটিতে ফিরে যেতে চাই, বিন / অ্যাক্টিভেটের একইভাবে।

এটার মতো কিছু:

$me: my-script.py -d env-name
$(env-name)me:

এটা কি সম্ভব?

প্রাসঙ্গিক:

virtualenv a একটি স্ক্রিপ্ট থেকে একটি এনভিল চাওয়া

উত্তর:


88

আপনি যদি ভার্চুয়ালেনভের অধীনে পাইথন সাব প্রসেস চালাতে চান, তবে স্ক্রিপ্টটি পাইথন ইন্টারপ্রেটার ব্যবহার করে স্ক্রিপ্টটি চালিয়ে যা করতে পারেন যা ভার্চুয়ালেনভের / বিন / ডিরেক্টরিতে থাকে:

import subprocess

# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

তবে আপনি যদি সাব-প্রসেসের পরিবর্তে বর্তমান পাইথন ইন্টারপ্রেটারের অধীনে ভার্চুয়ালেনভকে সক্রিয় করতে চান তবে আপনি activate_this.pyস্ক্রিপ্টটি ব্যবহার করতে পারেন :

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))

4
//, করা উচিত নয় এই উত্তরে প্রথম কোড ব্লক গত লাইন নিম্নরূপ পড়তে যে: subprocess.Popen([venv_python_file, script_file])?
নাথান বাসানিজ

//, এছাড়াও, script_fileএকটি স্বেচ্ছাসেবক অবস্থান থেকে চালানোর কোন উপায় আছে , বা এটি virtualenvডিরেক্টরিতে থাকতে হবে?
নাথান বাসানিজ

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

আমি যদি দ্বিতীয় বিকল্পটি ব্যবহার করি তবে আমি কীভাবে ভার্চুয়াল এনভিভি নিষ্ক্রিয় করতে পারি?
মিথ্যা পকেট

@ ফলসপকেটস: এক্সওয়াই সমস্যা , আপনি কেন কখনও তা করতে চান?
মিথ্যা রায়ান

42

আপনার স্ক্রিপ্টটি ভার্চুয়ালেনভের দোভাষীর অধীনে চালিত করার সহজ সমাধান হ'ল স্ক্রিপ্টের শুরুতে আপনার ভার্চুয়ালেনভের দোভাষীর পথের সাথে ডিফল্ট শেবাং লাইনটি প্রতিস্থাপন করা:

#!/path/to/project/venv/bin/python

স্ক্রিপ্টটি সম্পাদনযোগ্য করুন:

chmod u+x script.py

স্ক্রিপ্টটি চালান:

./script.py

ভয়েলা!


4
কমনীয়তার জন্য +1। উইন্ডোতে নোট করুন এর জন্য একটি পিক্সিক্স কমপ্লায়েন্ট এনভায়রনমেন্ট দরকার যা সাইগউইন বা এমএসএসির মতো শেবাং লাইনগুলি বোঝে
qneill

4
অজগর 3.6.3 এবং উইন্ডোজ 10 এর জন্য কাজ করে!
toonarmycaptain

ভাবেন আমি হয়ত আসল প্রশ্নটি ভুল বুঝেছি। তিনি একটি স্ক্রিপ্ট সহ ভার্চুয়াল পরিবেশ সক্রিয় করতে এবং সক্রিয় পরিবেশের সাথে শেলটিতে ফিরে যেতে চান। আমার উত্তর ভার্চুয়াল পরিবেশে স্ক্রিপ্ট চালায় তবে ফিরে আসা শেলটি পরিবেশ ধরে রাখে না। আধুনিক দিনের সমাধানটি হ'ল ভার্চুয়ালেনভ্রাপার: ভ্যুচুয়ালেনভ্রাপার.ড্রেডহেডোকস.আইও / এএন / এলিটস্ট /# । এটি একটিকে সক্রিয় করতে এবং বিভিন্ন ভার্চুয়ালেনভের মধ্যে স্যুইচ করার অনুমতি দেয়।
nafooesi

20

দেখা যাচ্ছে যে, হ্যাঁ, সমস্যাটি সহজ নয়, তবে সমাধানটি।

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

#!/bin/bash
. /path/to/env/bin/activate

তারপরে আমার পাইথন স্ক্রিপ্ট থেকে আমি সহজভাবে এটি করতে পারি:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

পুরো কৌশলটি --rcfileতর্কের মধ্যেই নিহিত ।

পাইথন ইন্টারপ্রেটারটি যখন প্রস্থান করে এটি সক্রিয় পরিবেশে বর্তমান শেলটি ছেড়ে দেয়।

জয়!


4
আমি সত্যিই এটি পাই না। কেন আপনি কেবল এটি করেন না: os.system('/bin/bash --rcfile path/to/env/activate') আপনি জানেন, যখন ব্যাশের উদাহরণ শুরু হয়, তখন --rcfile- এর পক্ষে আর্গুমেন্ট হিসাবে .Bashrc লাগে। সুতরাং কেবল উল্লেখ করুন যে আরসিফাইলটি আপনার অ্যাক্টিভেট ফাইল ... না?
দেপাদো

@ দেপাদো আমি আপনার সমাধানটি চেষ্টা করেছি এবং এটি পাইথনের মধ্যে শেলটি সক্রিয় করবে। কমপক্ষে যখন আমি শেলটি দিয়ে চেষ্টা করি। >>> ওএস.সিস্টেম ('/ বিন / বাশ --rcfile / var / envs / পরীক্ষা / বিন / অ্যাক্টিভেট') (পরীক্ষা) tcraig @ ললিস-ডেস্কটপ: ~ $ (পরীক্ষা) tcraig @ ললিস-ডেস্কটপ: ~ $ ls -l মোট 706288
ট্রেন্টন

হতে পারে তবে এটি একটি স্ক্রিপ্টে কাজ করে। এই কৌশলটির সাথে একমাত্র অসুবিধাই হ'ল আপনি আপনার সমস্ত উপাধি এবং আপনার ~ / .Bashrc এ যা কিছু পেয়েছিলেন তা পান না। তবে আমি এটির সাথে ভাল আছি। উদাহরণস্বরূপ "ls" কমান্ডের কোনও রঙ নেই। তবে সবকিছুই আমার পক্ষে কাজ করে। যখন আমি চলে যেতে চাই, আমি কেবল Ctrl + D
Depado

7
"অজগর দোভাষী যখন প্রস্থান করেন এটি সক্রিয় পরিবেশে বর্তমান শেলটি ছেড়ে দেয়" কী? এটি একটি সাবপ্রসেস হিসাবে সম্পূর্ণ নতুন শেল তৈরি করেছে এবং এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করে।
কোস

আমার সংগ্রহস্থলে আরও নতুন ফাইল তৈরি করা এড়াতে এবং বর্তমান ব্যাশ কনফিগারেশনের প্রতিরূপ তৈরি করতে, আমি এটি করেছি:cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
কেন

17

অফিসিয়াল ভার্চুয়ালেনভ ডকুমেন্টেশন অনুসারে আর একটি পাইথন পরিবেশ চালানোর জন্য , কমান্ড লাইনে আপনি এক্সিকিউটেবল পাইথন বাইনারিটির পুরো পথ নির্দিষ্ট করতে পারেন, কেবল (পূর্বে ভার্চুয়ালেনভকে সক্রিয় করার দরকার নেই):

/path/to/virtualenv/bin/python

আপনি যদি আপনার ভার্চুয়ালেনভের সাথে কমান্ড লাইন থেকে কোনও স্ক্রিপ্ট চাওয়া চান তবে এটি একই প্রযোজ্য। আপনার আগে এটি সক্রিয় করার দরকার নেই:

me$ /path/to/virtualenv/bin/python myscript.py

উইন্ডোজ পরিবেশের জন্য একই (এটি কমান্ড লাইন থেকে বা স্ক্রিপ্ট থেকে):

> \path\to\env\Scripts\python.exe myscript.py

4
প্রশ্নটি হল: পাইথন স্ক্রিপ্ট (শেল থেকে নয়) দিয়ে একটি ভার্চুয়ালেনভকে সক্রিয় করুন
জহির

4
হ্যাঁ, আমার বক্তব্যটি হ'ল আপনি কোনও ভার্চুয়াল পরিবেশ থেকে অজগর রানটাইমটিকে কল করার আগে, কনসোল বা স্ক্রিপ্ট থেকে আগে এটি সক্রিয় করার প্রয়োজন নেই। আমি উত্তরটি পরিষ্কার করব, ধন্যবাদ!
মারিয়ানো রুইজ

ওরে আমার মঙ্গল! আমি এটি সম্পর্কে চিন্তা না। এটি আমার জন্য একমাত্র সমাধান যা কাজ করেছিল :)। এখন, আমি যখন পিএইচপি থেকে পাইথন স্ক্রিপ্টটি সম্পাদন করছি, তখন আমি ব্যবহার করছি: "পথ / টু / ভ্যাচুয়ালেনভি / বিন / পাইথন মাইপাইথনসক্রিপ.পি"
জহির

6

আমার পক্ষে কার্যকর একটি সহজ সমাধান। আমি জানি না কেন আপনার বাশ স্ক্রিপ্টের প্রয়োজন যা মূলত একটি অকেজো পদক্ষেপ করে (আমি কি ভুল?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

মূলত আপনার যা প্রয়োজন তা করে:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

তারপরে ভার্চুয়াল পরিবেশটি নিষ্ক্রিয় না করে কেবল Ctrl+ Dবা প্রস্থান করুন। এটি কি একটি সম্ভাব্য সমাধান বা আপনি যা চান তা নয়?


2

শিশু প্রক্রিয়া পরিবেশটি তার উপস্থিতি বন্ধ হওয়ার মুহুর্তে হারিয়ে যায় এবং সেখান থেকে পরিবেশের সামগ্রীগুলি পিতামাতার কাছে স্থানান্তর করা কিছুটা জটিল।

আপনার সম্ভবত একটি শেল স্ক্রিপ্ট তৈরি করতে হবে (আপনি / টেম্পে ডায়নামিকভাবে একটি জেনারেট করতে পারেন) যা ভার্চুয়ালেনভ এনভায়রনমেন্ট ভেরিয়েবলগুলিকে কোনও ফাইলে আউটপুট দেয়, যা আপনি পরে প্যারেন্ট পাইথন প্রক্রিয়ায় পড়ে এবং ওএস.ইনোমেনারে রাখবেন।

অথবা আপনি খালি লাইনে ("বিন / অ্যাক্টিভেট") ব্যবহার করে অ্যাক্টিভেট স্ক্রিপ্টটি পার্স করতে পারেন, ম্যানুয়ালি স্টাট এক্সট্রাক্ট করে ওএস.এনভায়রনমেন্টে রেখেছেন। এটি কৃপণ, তবে অসম্ভব নয়।


4
তুমি এরকম কিছু বোঝাতে চাও? bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/…
h3।

2

শীর্ষের উত্তরটি কেবল পাইথন ২.x এর জন্য কাজ করে

পাইথন ৩.x এর জন্য এটি ব্যবহার করুন:

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

তথ্যসূত্র: পাইথন 3 এ ফাঁসির বিকল্প কী?


4
activate_this.py কি
র্যান্ডি পেন

4
@ ইরানডিপেন, আপনি যখন নিজের প্রকল্প ডিরেক্টরিতে ভার্চুয়ালেনভ তৈরি করেন তখন অ্যাক্টিভেট_থিস.পি ফাইলটি স্বয়ংক্রিয়ভাবে যুক্ত হয়। (যেমন / প্রজেক্ট / ডিরেক্টরী / আভেনভি / বিন / অ্যাক্টিভেট_থিস.পি)
তাত্ত্বিকভাবে

-2

আপনার virtualenvসমস্তগুলি একটি ফোল্ডারে যেমন তৈরি করা উচিত virt

আপনার ভ্যাচুয়ালেভ ফোল্ডারের নামটি যদি এটি পরিবর্তন না করে তবে এটি গুণমানবান

cd
mkdir custom

নীচের লাইনগুলি অনুলিপি করুন ...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

একটি শেল স্ক্রিপ্ট ফাইল তৈরি করুন এবং উপরের লাইনগুলি পেস্ট করুন ...

touch custom/vhelper
nano custom/vhelper

আপনার ফাইলে এক্সিকিউটেবল অনুমতি দিন:

sudo chmod +x custom/vhelper

এখন সেই কাস্টম ফোল্ডার পাথটি এক্সপোর্ট করুন যাতে আপনি এটি ক্লিক করে ট্যাব ক্লিক করে কমান্ড-লাইনে খুঁজে পেতে পারেন ...

PATH = $ PATH: "OME হোম / কাস্টম" রফতানি করুন

এখন আপনি কেবল নীচের কমান্ডটি টাইপ করে এটি যে কোনও জায়গা থেকে ব্যবহার করতে পারেন ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

মনে করুন এটি তখন অব ...

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