ব্যবহারকারীর মতো মোতায়েনের মাধ্যমে একটি ভার্চুয়ালেনভ সক্রিয় করুন


130

আমি স্থানীয়ভাবে আমার ফ্যাব্রিক স্ক্রিপ্টটি চালাতে চাই, যা ঘুরেফিরে আমার সার্ভারে লগইন করবে, ব্যবহারকারী মোতায়েন করতে, প্রজেক্টগুলি সক্রিয় করতে .virtualenv, যা প্রকল্পে দির পরিবর্তন করবে এবং গিট টান দেবে।

def git_pull():
    sudo('su deploy')
    # here i need to switch to the virtualenv
    run('git pull')

আমি সাধারনত ভার্চুয়ালেনভ্রাপার থেকে ওয়ার্কন কমান্ডটি ব্যবহার করি যা সূত্রটি অ্যাক্টিভেট ফাইল এবং পোস্টঅ্যাক্টিভেট ফাইলটি আমাকে প্রকল্প ফোল্ডারে রাখবে। এই ক্ষেত্রে, দেখে মনে হচ্ছে যে ফ্যাব্রিকটি শেলের মধ্যে থেকে চলে তাই নিয়ন্ত্রণটি ফ্যাব্রিককে ছেড়ে দেওয়া হয়, তাই আমি '$ উত্স ~ / .virtualenv / myvenv / বিন / অ্যাক্টিভেট' এ অন্তর্নির্মিত ব্যাশের উত্স ব্যবহার করতে পারি না

তারা কীভাবে এই কাজ করেছে তার কারও উদাহরণ এবং ব্যাখ্যা আছে?


1
আউট কৌতুহল, কেন তুমি ব্যবহার করছেন না workonহিসেবে prefix?
ড্যানিয়েল সি সোব্রাল

উত্তর:


96

এই মুহূর্তে, আপনি আমার যা করতে পারেন তা ক্লডগি তবে পুরোপুরি ভালভাবে কাজ করে * (এই ​​ব্যবহারটি ধরে নেওয়া হয় যে আপনি ভার্চুয়ালেনভ্র্যাপার ব্যবহার করছেন - যা আপনার হওয়া উচিত - তবে আপনি বরং উল্লিখিত 'উত্স' কলটিতে উল্লেখ করতে পারেন যা আপনি উল্লেখ করেছেন , যদি না):

def task():
    workon = 'workon myvenv && '
    run(workon + 'git pull')
    run(workon + 'do other stuff, etc')

সংস্করণ 1.0, যেহেতু ফ্যাব্রিকের একটি prefixপ্রসঙ্গ পরিচালক রয়েছে যা এই কৌশলটি ব্যবহার করে যাতে আপনি উদাহরণস্বরূপ পারেন:

def task():
    with prefix('workon myvenv'):
        run('git pull')
        run('do other stuff, etc')

* এমন কিছু ক্ষেত্রে আবশ্যক যেখানে command1 && command2পন্থাটি ব্যবহার করা আপনার উপর ঝাপিয়ে পড়তে পারে, যেমন কখন command1ব্যর্থ হয় ( command2কখনই চলবে না) বা যদি command1যথাযথভাবে পালানো না যায় এবং এতে বিশেষ শেল অক্ষর থাকে এবং আরও অনেক কিছু।


7
তবে workonঅজানা sh। পরিবর্তে ব্যাশ ব্যবহার করতে আমরা ফ্যাব্রিককে কীভাবে বলতে পারি?
পিয়েরে লেস্পিনে

18
আইএমএইচও আপনার কেবল ব্যবহার করা উচিত source venv/bin/activate। এটি সহজ এবং বাক্সের বাইরে কাজ করে। workonএটি একটি অতিরিক্ত নির্ভরতা এবং এটি ইনস্টল করা হলেও আপনাকে এটিকে যুক্ত করতে হবে .bashrc- ফ্যাব্রিক মোতায়েনের জন্য খুব জটিল।
ডেভ হাল্টার

@PierredeLESPINAY দেখতে stackoverflow.com/questions/11272372/... আপনার সমস্যা জন্য একটি সমাধান জন্য।
ডেকেবিডি

137

বিটপ্রোফেটের পূর্বাভাসের আপডেট হিসাবে: ফ্যাব্রিক ০.০ এর সাহায্যে আপনি উপসর্গ () এবং আপনার নিজস্ব প্রসঙ্গ পরিচালকদের ব্যবহার করতে পারেন ।

from __future__ import with_statement
from fabric.api import *
from contextlib import contextmanager as _contextmanager

env.hosts = ['servername']
env.user = 'deploy'
env.keyfile = ['$HOME/.ssh/deploy_rsa']
env.directory = '/path/to/virtualenvs/project'
env.activate = 'source /path/to/virtualenvs/project/bin/activate'

@_contextmanager
def virtualenv():
    with cd(env.directory):
        with prefix(env.activate):
            yield

def deploy():
    with virtualenv():
        run('pip freeze')

@ সিমন, আপনার নিজের উপসর্গ পদ্ধতি লিখে যা .bashrc কল করে এবং ব্যাশের জন্য -c আর্গুমেন্টের মধ্যে উপসর্গ এবং কমান্ড উভয়কেই মোড়বে। নীচে
ডেভ

5
তবে sourceঅজানা sh। পরিবর্তে ব্যাশ ব্যবহার করতে আমরা ফ্যাব্রিককে কীভাবে বলতে পারি?
পিয়েরে লেস্পিনে

2
আপনি ব্যবহার করতে পারেন @PierredeLESPINAY .পরিবর্তেsource
Katy lavallee

কেন তুমি ব্যবহার করবেন cd()যখন আপনি সম্পূর্ণরূপে পাথ উল্লেখ করছি activateমধ্যে prefix()?
নিক টি

@ নিকটি কারণ prefix()সেখানে সিডি বলে মনে হচ্ছে না - এই ডক্সগুলি একই রকম দেখুন। আমরা cdসেখানে চাই যাতে আমরা যখন yieldঅন্যান্য কমান্ডগুলি pip freezeপ্রয়োগ করতে পারি ( আমার উদাহরণে), সেই আদেশগুলি সেই ডিরেক্টরিটির সাথে সম্পর্কিত হতে পারে।
এনএইচ

18

আমি কেবল একটি সাধারণ মোড়কের ফাংশনটি ব্যবহার করছি ভার্চুয়ালেনভ () যা রান () এর পরিবর্তে কল করা যেতে পারে। এটি সিডি কনটেক্সট ম্যানেজার ব্যবহার করে না, তাই আপেক্ষিক পাথগুলি ব্যবহার করা যেতে পারে।

def virtualenv(command):
    """
    Run a command in the virtualenv. This prefixes the command with the source
    command.
    Usage:
        virtualenv('pip install django')
    """
    source = 'source %(project_directory)s/bin/activate && ' % env
    run(source + command)

9

virtualenvwrapper এটিকে একটু সহজ করে তুলতে পারি

  1. @ Nh2 এর পদক্ষেপ ব্যবহার (যখন ব্যবহার করে এই পদ্ধতির এছাড়াও কাজ করে local, কিন্তু শুধুমাত্র ইনস্টলেশনের যেখানে virtualenvwrapper জন্য workonরয়েছে $PATH, অন্য কথায় - উইন্ডোস)

    from contextlib import contextmanager
    from fabric.api import prefix
    
    @contextmanager
    def virtualenv():
        with prefix("workon env1"):
            yield
    
    def deploy():
        with virtualenv():
            run("pip freeze > requirements.txt")
  2. অথবা আপনার ফাব ফাইলটি স্থাপন করুন এবং এটিকে স্থানীয়ভাবে চালান। এই সেটআপটি আপনাকে স্থানীয় বা দূরবর্তী কমান্ডের জন্য ভার্চুয়ালেনভ সক্রিয় করতে দেয়। এই পদ্ধতিটি শক্তিশালী কারণ এটি localব্যবহার করে .bashrc চালাতে প্রায় অক্ষমতা কাজ করে bash -l:

    @contextmanager
    def local_prefix(shell, prefix):
        def local_call(command):
            return local("%(sh)s \"%(pre)s && %(cmd)s\"" % 
                {"sh": shell, "pre": prefix, "cmd": command})
        yield local_prefix
    
    def write_requirements(shell="/bin/bash -lic", env="env1"):
        with local_prefix(shell, "workon %s" % env) as local:
            local("pip freeze > requirements.txt")
    
    write_requirements()  # locally
    run("fab write_requirements")

এনএইচ 2 এর উত্তরের সংক্ষিপ্তসার জন্য ধন্যবাদ, পাইথন ২.6+ এর উপরে ভার্চুয়ালেনভ প্রসঙ্গের ব্যবস্থাপনার ঘোষণাপত্রটি পাঁচ লাইনে করা যেতে পারে, তবে এটি কখনও নিশ্চিত হয় না যে 'ওয়ার্কন' ওরফে সর্বদা সঠিকভাবে আমদানি করা হয়, এবং এটি 'উত্স ... / সক্রিয়করণ' ব্যবহার করা আরও নির্ভরযোগ্য আদেশ
অ্যালেক্স ভোলকভ

8

virtualenvস্থানীয় মোতায়েনের সাথে এটি ব্যবহার করার ক্ষেত্রে আমার দৃষ্টিভঙ্গি ।

ফ্যাব্রিকের পাথ () কনটেক্সট ম্যানেজার ব্যবহার করে আপনি চালিয়ে নিতে পারেন pipবা pythonভার্চুয়ালেনভের বাইনারিগুলির সাথে।

from fabric.api import lcd, local, path

project_dir = '/www/my_project/sms/'
env_bin_dir = project_dir + '../env/bin/'

def deploy():
    with lcd(project_dir):
        local('git pull origin')
        local('git checkout -f')
        with path(env_bin_dir, behavior='prepend'):
            local('pip freeze')
            local('pip install -r requirements/staging.txt')
            local('./manage.py migrate') # Django related

            # Note: previous line is the same as:
            local('python manage.py migrate')

            # Using next line, you can make sure that python 
            # from virtualenv directory is used:
            local('which python')

আমি এটি খুব পছন্দ করি - আমি এই পদ্ধতির কোনও স্পষ্ট অসুবিধা দেখতে পাচ্ছি না এবং এটি খুব পরিষ্কার very ধন্যবাদ :)
সাইমন

এখনও এখানে সেরা এবং সবচেয়ে পরিষ্কার উত্তর
n1_

4

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

>>> from fabvenv import virtualenv
>>> with virtualenv('/home/me/venv/'):
...     run('python foo')

ফ্যাব্রিক-ভার্চুয়ালেনভ ব্যবহার করে fabric.context_managers.prefix, যা একটি ভাল উপায় হতে পারে :)


আকর্ষণীয় তবে এসসিএম / ইস্যু ট্র্যাকারের কোনও লিঙ্ক নেই তা আমি পছন্দ করি না। উত্স কোড এবং ইস্যু ট্র্যাকারটির লিঙ্ক ছাড়াই কেবল পিওয়াইপিআইতে প্রকাশিত একটি প্যাকেজ খুব বেশি বিশ্বাসকে অনুপ্রাণিত করে না .... তবে এটি ঠিক করা সহজ।
সোমিন

2

আপনি যদি পরিবেশে প্যাকেজগুলি ইনস্টল করতে চান বা আপনার পরিবেশে থাকা প্যাকেজগুলি অনুসারে কমান্ড চালাতে চান তবে আমার সমস্যার সমাধান করার জন্য এই হ্যাকটি খুঁজে পেয়েছি, ফ্যাব্রিকের জটিল পদ্ধতিগুলি লেখার পরিবর্তে বা নতুন ওএস প্যাকেজ ইনস্টল করার পরিবর্তে:

/path/to/virtualenv/bin/python manage.py migrate/runserver/makemigrations  # for running commands under virtualenv

local("/home/user/env/bin/python manage.py migrate")    # fabric command


/path/to/virtualenv/bin/pip install -r requirements.txt   # installing/upgrading virtualenv

local("/home/user/env/bin/pip install -r requirements.txt")  #  fabric command

এইভাবে আপনার পরিবেশ সক্রিয় করার প্রয়োজন নাও হতে পারে তবে আপনি পরিবেশের অধীনে আদেশগুলি কার্যকর করতে পারেন।


1

এখানে একটি সাজসজ্জারের কোড রয়েছে যা কোনও রান / সুডো কলগুলির জন্য ভার্চুয়াল পরিবেশের ব্যবহারের ফলস্বরূপ হবে:

# This is the bash code to update the $PATH as activate does
UPDATE_PYTHON_PATH = r'PATH="{}:$PATH"'.format(VIRTUAL_ENV_BIN_DIR)

def with_venv(func, *args, **kwargs):
  "Use Virtual Environment for the command"

  def wrapped(*args, **kwargs):
    with prefix(UPDATE_PYTHON_PATH):
      return func(*args, **kwargs)

  wrapped.__name__ = func.__name__
  wrapped.__doc__ = func.__doc__
  return wrapped

এবং তারপরে সাজসজ্জার ব্যবহার করতে, সজ্জাকারীর ক্রমটি গুরুত্বপূর্ণ:

@task
@with_venv
def which_python():
  "Gets which python is being used"
  run("which python")

1

এই পদ্ধতিটি আমার পক্ষে কাজ করেছে, আপনি এটিও প্রয়োগ করতে পারেন।

from fabric.api import run 
# ... other code...
def install_pip_requirements():
    run("/bin/bash -l -c 'source venv/bin/activate' "
        "&& pip install -r requirements.txt "
        "&& /bin/bash -l -c 'deactivate'")

ধরে venvনেওয়া আপনার ভার্চুয়াল এনভিটি ডিরেক্টরি এবং যেখানে উপযুক্ত সেখানে এই পদ্ধতিটি যুক্ত করুন।

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