我正在尝试将列表中的每个项目的需求自动安装到它自己的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的一个)
谢谢
我的同事说我可以用venv中的python和venv中的pip文件来调用它。我现在正在测试它。谢谢你的解释,把bash和python结合起来就是开玩笑 – codyc4321