2015-11-26 16 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