2012-06-21 49 views
3

我使用virtualenvwrapper来为我的django deployement使用virtualenv。 以下是我fabric任务:面料:无法使用virtualenvwrapper切换virtualenv?

proj_path = '/path/to/proj' 

def setup_code(): 
    sudo('pip install virtualenvwrapper') 
    run('export WORKON_HOME=$HOME/.virtualenvs') 
    run('source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv myenv') 
    run('source /usr/local/bin/virtualenvwrapper.sh && workon myenv') 
    cd(proj_path) 
    req_file = os.path.join(proj_path, 'requirements.txt') 
    run('pip install -r %s' % req_file) 

我执行上述任务fab,但其举止异常。 pip开始检索所有包,然后开始为它们执行安装文件。在执行setup文件时,它崩溃说Permission denied

但是为什么?其内部工作~virtualenv

请帮助..我发现我做错了什么?

回答

8

想通了这个问题:

面料:

cd('dir') # doesn't works. 

以下工作:

with cd('dir'): 
    print('pwd') # Directory change reflects here. 

同样,其他环境的东西,如:

run('export WORKON_HOME=$HOME/.virtualenvs') 
run('source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv myenv') 
run('source /usr/local/bin/virtualenvwrapper.sh && workon myenv') 

但改为:

with prefix('WORKON_HOME=$HOME/.virtualenvs'): 
    with prefix('source /usr/local/bin/virtualenvwrapper.sh'): 
     with prefix('workon myenv'): # Assuming there is a env called `myenv` 
      run('pip install -r requirements.txt') # Works in virtualenv 

想通了,从官方文档:http://docs.fabfile.org/en/stable/api/core/context_managers.html

+0

注意'source'不'sh'知道(这Fabric使用) –

+0

你怎么设法得到这个工作的时候是bash不那么默认的shell呢? – Ponytech

0

我认为那不起作用,因为那么你活动virtualenv它做你的现有环境一些魔术,但据我所知织物没有与环境自己的壳。你可以尝试这样的:

run('/home/your_folder/virtualenv/bin/pip install -r %s' % req_file) 
0

如果你不想用你的.bashrc,那么这里就是那会与最新的面料做工的解决方案(1.10)+ virtualenvwrapper(1.11.4):

with shell_env(WORKON_HOME=run('printf $HOME/.virtualenvs'), 
     prefix('source /usr/share/virtualenvwrapper/virtualenvwrapper.sh'): 

    run('mkvirtualenv foo')  
    with prefix('workon foo'): 
     run('which python')