2015-11-26 48 views
2

我正在尝试将列表中的每个项目的需求自动安装到它自己的virtualenv中。我已经得到了正确制作的virtualenv的观点,但我不能让它激活和安装要求纳入只的virtualenv:你如何在python脚本中对任意virtualenv安装需求?

#!/usr/bin/env python 

import subprocess, sys, time, os 

HOMEPATH = os.path.expanduser('~') 

CWD = os.getcwd() 

d = {'cwd': ''} 


if len(sys.argv) == 2: 
    projects = sys.argv[1:] 


def call_sp(command, **arg_list): 
    p = subprocess.Popen(command, shell=True, **arg_list) 
    p.communicate() 

def my_makedirs(path): 
    if not path.startswith('/home/cchilders'): 
     path = os.path.join(HOMEPATH, path) 
    try: os.makedirs(path) 
    except: pass 

for project in projects: 
    path  = os.path.join(CWD, project) 
    my_makedirs(path) 
    git_string = 'git clone [email protected]:codyc54321/{}.git {}'.format(project, d['cwd']) 
    call_sp(git_string) 
    d = {'executable': 'bash'} 
    call_sp("""source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv --no-site-packages {}""".format(project), **d) 
    # call_sp("""source /usr/local/bin/virtualenvwrapper.sh && workon {}""".format(project), **d) 
    # below, the dot (.) means the same as 'source'. the dot doesn't error, calling source does 
    call_sp('. /home/cchilders/.virtualenvs/{}/bin/activate'.format(project)) 
    d = {'cwd': path} 
    call_sp("pip install -r requirements.txt", **d) 

它的工作原理高达

call_sp("""source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv --no-site-packages {}""".format(project), **d) 

但脚本结束时,我不活跃在venv,venv没有任何要求的包裹。收集venv(被注释掉的和生活中的一个)的努力都失败了。

帮助我得到mkvirtualenv工作的答案是subprocess.Popen: mkvirtualenv not found

我也注意到我需要做的不仅仅是pip安装,在一种情况下,我需要运行'python setup.py mycommand',它为每个项目自动安装。如何运行命令,就好像一个virtualenv被激活,并且还将依赖关系安装到python脚本中的任意venvs中?

我周围发现的唯一方法是手动转换virtualenv,然后手动调用我的python脚本。我很惊讶,我把它由bash的工作,但呼吁轰炸了python脚本(也许是因为它是一个不同的过程比bash的一个)

谢谢

回答

1

这是因为每个call_sp调用创建一个新的外壳,所以在第一次调用call_sp后,由virtualenvwrapper创建的所有设置都消失了。您必须将所有命令组合到单个call_sp链中。否则,您可以使用'Popen'启动shell并使用通信将命令提供给它。

如果你走得更远,你需要小心地同步和检测需求安装何时结束。 Pip可能需要很长时间才能下载和安装具有复杂依赖性的软件包。

+0

我的同事说我可以用venv中的python和venv中的pip文件来调用它。我现在正在测试它。谢谢你的解释,把bash和python结合起来就是开玩笑 – codyc4321

相关问题