【问题标题】:I am unable to switch virtualenv with virtualenvwrapper in Fabric我无法在 Fabric 中使用 virtualenvwrapper 切换 virtualenv
【发布时间】:2012-06-23 14:48:34
【问题描述】:

我使用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 内部工作。

我做错了什么?

【问题讨论】:

    标签: python django virtualenv fabric virtualenvwrapper


    【解决方案1】:

    找出问题所在:

    面料:

    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

    【讨论】:

    • 请注意,source 不为 sh 所知(Fabric 使用)
    • 当 bash 不是默认 shell 时,你如何设法让它工作?
    【解决方案2】:

    我认为那是行不通的,因为那时你激活了 virtualenv,它对你现有的环境有一些魔力,但据我所知,fabric 没有自己的外壳和环境。你可以这样试试:

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

    【讨论】:

      【解决方案3】:

      如果您不想使用 .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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 2021-03-08
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多