2012-04-08 65 views
4

我想创建一个引导脚本来设置本地环境并在其中安装所有需求。我一直在尝试使用virtualenv.create_bootstrap_script,如docs中所述。如何使用virtualenv引导脚本在虚拟环境中安装python软件包?

import virtualenv 
s = virtualenv.create_bootstrap_script(''' 
import subprocess 
def after_install(options, home_dir): 
    subprocess.call(['pip', 'install', 'django']) 
''') 
open('bootstrap.py','w').write(s) 

运行时所产生的bootstrap.py,它正确设置虚拟环境,但随后试图在全球范围内安装Django。

如何编写仅在本地虚拟环境中安装Django的引导脚本。它必须在Windows和Linux上工作。

回答

0

您需要将完全限定路径传递给虚拟环境中的pip脚本。

subprocess.call([join(home_dir, 'bin', 'pip'),'install','django'])

+1

谢谢。这在Windows下不起作用,因为它会是'./Scripts/pip.exe'。我真的必须为此做一个特例吗?或者,还有更好的方法? – 2012-04-08 12:25:17

+0

我不认为你必须这样做,pip的激活增强PATH变量afaik – skrat 2012-04-08 14:02:04

2

你可能会迫使PIP通过安装到你的virtualenv:

subprocess.call(['pip', 'install', '-E', home_dir, 'django']) 

此外,它是存储在requirements.txt文件的依赖性一个很好的和有用的约定,Django的是1.3倒是为:

django==1.3 

,然后在after_install

subprocess.call(['pip', 'install', '-E', home_dir, '-r', path_to_req_txt]) 
+0

+1看起来很有前途。 – delnan 2012-04-08 19:25:53

0

适用于Windows和Linux的解决方案。它使用由引导脚本安装的pip。

import virtualenv 
s = ''' 
import subprocess, os 
def after_install(options, home_dir): 
    if os.name == 'posix': 
    subprocess.call([os.path.join(home_dir, 'bin', 'pip'), 'install', '-r', 'requirements.txt']) 
    else: 
    subprocess.call([os.path.join(home_dir, 'Scripts', 'pip.exe'), 'install', '-r', 'requirements.txt']) 
''' 
script = virtualenv.create_bootstrap_script(s, python_version='2.7') 
f = open('bootstrap.py','w') 
f.write(script) 
f.close() 

只要把你的要求requirements.txt,一条线,每包:

django 
django-registration==1.4.3 

参见:Pip - Requiremments Files

-1

什么工作对我来说是从新创建环境中访问PIP

pip = os.path.join(home_dir, 'bin', 'pip') 

在这之后,我尝试安装Django的像前面那样。

subprocess.call([pip, 'install', 'django']) 

记住OS进口:

import os, subprocess 

希望它为你工作。

相关问题