如何在虚拟环境中只使用virtualenv引导脚本安装Python包?

4
我希望创建一个引导脚本来设置本地环境并安装其中的所有要求。我一直在尝试使用virtualenv.create_bootstrap_script,如文档中所述。
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上都能够工作。
4个回答

2
您可以通过以下方式强制pip安装到您的虚拟环境中:
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

你需要传递虚拟环境中 pip 脚本的完整路径。

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


1
谢谢。在Windows下这不会起作用,因为它将是'./Scripts/pip.exe'。我真的需要为此制作一个特殊情况吗?或者有更好的方法吗? - Erik Ninn-Hansen
我认为你不必这样做,据我所知,pip的激活会增加PATH变量。 - skrat

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

希望它对你有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接