패브릭을 통해 가상 환경을 배포 사용자로 활성화
패브릭 스크립트를 로컬로 실행하여 서버에 로그인하고 사용자를 배포로 전환하고 프로젝트 .virtualenv를 활성화하여 프로젝트로 dir를 변경하고 Git Pull을 실행합니다.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
저는 일반적으로 virtualenvrapper의 work on 명령을 사용합니다. 이 명령은 활성화 파일과 활성화 후 파일이 프로젝트 폴더에 저장합니다.이 경우 패브릭이 셸 내에서 실행되기 때문에 제어가 패브릭으로 넘겨지므로 bash의 소스 기본 제공을 사용하여 '$source ~/.virtualenv/myvenv/bin/activate'를 사용할 수 없습니다.
그들이 이것을 어떻게 했는지에 대한 예와 설명을 가진 사람이 있습니까?
비트프로펫의 예측에 대한 업데이트로서:Fabric 1.0에서는 접두사()와 자체 컨텍스트 관리자를 사용할 수 있습니다.
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')
지금 당장은 제가 하는 일을 할 수 있습니다. 즉, 흐리멍덩하지만 완벽하게 작동합니다.*(이 사용법은 가상 환경 래퍼를 사용하는 것으로 가정합니다. 사용해야 합니다. 하지만 언급한 '소스' 통화가 아닌 경우에는 쉽게 대체할 수 있습니다.)
def task():
workon = 'workon myvenv && '
run(workon + 'git pull')
run(workon + 'do other stuff, etc')
버전 1.0부터 Fabric에는 이 기술을 사용하는 컨텍스트 관리자가 있으므로 다음과 같은 작업을 수행할 수 있습니다.
def task():
with prefix('workon myvenv'):
run('git pull')
run('do other stuff, etc')
다음을 사용하는 경우가 있을 수밖에 없습니다.command1 && command2접근은 당신에게 폭발할 수 있습니다, 예를 들어.command1실패(command2실행되지 않음) 또는 다음과 같은 경우command1제대로 이스케이프되지 않았으며 특수 셸 문자 등이 포함되어 있습니다.
저는 run() 대신 호출할 수 있는 간단한 래퍼 함수 virtualenv()를 사용하고 있습니다.cd 컨텍스트 관리자를 사용하지 않으므로 상대 경로를 사용할 수 있습니다.
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)
virtualenvwrapper이것을 조금 더 간단하게 만들 수 있습니다.
@nh2의 접근법 사용(이 접근법은 사용할 때도 유효함)
local그러나 가상 환경 래퍼 설치에만 해당됩니다.workon안에 있습니다.$PATH즉, Windows(윈도우)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")또는 팹 파일을 배포하고 로컬로 실행합니다.이 설정을 통해 로컬 또는 원격 명령에 대한 가상 환경을 활성화할 수 있습니다.이 접근 방식은 효과적이기 때문에 강력합니다.
local를 사용하여 .tvrc를 실행할 수 없음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")
이것이 사용에 대한 저의 접근 방식입니다.virtualenv로컬 배포 환경에서 사용할 수 있습니다.
패브릭의 경로() 컨텍스트 관리자를 사용하여 실행할 수 있습니다.pip또는pythonvirtualenv의 이진 파일을 사용합니다.
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')
게시된 모든 답변에 감사드리며 이에 대한 대안을 하나 더 추가하고자 합니다.동일한 코드로 기능을 제공할 수 있는 fabric-virtualenv라는 모듈이 있습니다.
>>> from fabvenv import virtualenv
>>> with virtualenv('/home/me/venv/'):
... run('python foo')
는 패릭-가사환용는을 합니다.fabric.context_managers.prefix 방법일 요 :) ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ :)
패키지를 환경에 설치하거나 환경에 있는 패키지에 따라 명령을 실행하고 싶다면 복잡한 패브릭 방법을 작성하거나 새로운 OS 패키지를 설치하는 대신 문제를 해결하기 위해 이 해킹을 찾았습니다.
/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
이렇게 하면 환경을 활성화할 필요가 없지만 환경에서 명령을 실행할 수 있습니다.
다음은 실행/실행 호출에 가상 환경을 사용하게 되는 데코레이터 코드입니다.
# 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")
이 방법이 저에게 효과가 있었으니, 이것도 적용할 수 있습니다.
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가상 환경 디렉토리이며 필요한 경우 이 방법을 추가합니다.
플러그인 pyenv-virtualenvrapper와 함께 pyenv를 사용합니다.작업에 성공하지 못했고 대신 다음을 사용했습니다(패브릭 2.5).
with c.prefix('source /home/mirek/.virtualenvs/%s/bin/activate' % PROJECT):
with c.prefix('cd /home/mirek/%s/%s' % (PROJECT, PROJECT)):
c.run('python manage.py ....')
위해서git pull에이전트 포워딩이 좋습니다.ssh -A ..에 있어서 더 나은.~/.ssh/config다음과 같은 것:
Host forpsi
HostName xx.xx.xx.xx
IdentityFile /home/mirek/.ssh/id_ed25519_xxx
ForwardAgent yes
시스템에서 ()ssh-add혹은 가지고 계신다면AddKeysToAgent yes~/.ssh/config당신이 만든 후에git push그 다음 ) 그때git pull키의 암호 구문을 묻지 않아야 합니다.
언급URL : https://stackoverflow.com/questions/1180411/activate-a-virtualenv-via-fabric-as-deploy-user
'programing' 카테고리의 다른 글
| 파일에 대한 Oracle 스풀의 최대 열 너비 (0) | 2023.08.08 |
|---|---|
| 필드가 과거일 때 SQL 업데이트 레코드 (0) | 2023.08.08 |
| apt-get Oracle Java 7 설치가 중지 (0) | 2023.08.08 |
| 어떻게 글라이드를 사용하여 이미지를 비트맵으로 다운로드합니까? (0) | 2023.08.08 |
| c# 두 값 사이에 새 값을 삽입하는 방법을 나열합니다. (0) | 2023.08.08 |