【发布时间】:2016-03-01 01:05:58
【问题描述】:
我正在尝试将列表中每个项目的要求自动安装到其自己的 virtualenv 中。我已经到了正确制作 virtualenv 的地步,但我无法让它激活并将要求安装到该 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 git@bitbucket.org: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 脚本中将依赖项安装到任意 venv?
我发现的唯一方法是手动打开 virtualenv,然后手动调用我的 python 脚本。我很惊讶,通过 bash 将其打开有效,但调用 python 脚本被轰炸(可能是因为它与 bash 的进程不同)
谢谢
【问题讨论】:
标签: python bash scripting virtualenv virtualenvwrapper