无法在Fabric中使用virtualenvwrapper切换虚拟环境

4

我正在使用virtualenvwrapper来使用virtualenv进行我的Django部署。 以下是我的Fabric任务:

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中工作正常。

我做错了什么?

3个回答

8
找到了问题:
对于 Fabric:
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

该链接提供了相关的IT技术信息,可以帮助您更好地理解。


请注意,source 命令在 sh 中不可用(Fabric 使用的命令)。 - Pierre de LESPINAY
当Bash不是默认shell时,您如何管理使其正常工作? - Ponytech

0
如果您不想使用您的.bashrc,那么这里有一个解决方案,可以与最新的Fabric(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')

0

我认为这不起作用,因为当您激活virtualenv时,它会对现有环境进行一些魔法,但是据我所知,fabric没有自己的带环境的shell。您可以尝试像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接