通过chef配方激活virtualenv并安装python库

3 投票
3 回答
6016 浏览
提问于 2025-04-17 22:44

我有一个Python包需要在虚拟环境(virtualenv)中安装。这个是一个虚拟服务器,它是通过下面显示的Chef食谱(chef recipes)来配置的。我尝试了多种方法来激活虚拟环境,但都没有成功。任何建议都很感激。

python_virtualenv "/home/vagrant/myenv" do
  interpreter "python2.7"
  owner "vagrant"
  group "vagrant"
  action :create
end



directory "/usr/local/mysource" do
  owner "vagrant"
  group "vagrant"
  mode 0755
  action :create
end



git "/usr/local/mysource/django" do
  repository "https://github.com/django/django"
  revision "master"
  action :sync
end


script "install_script" do
  interpreter "bash"
  user "vagrant"
  cwd "/usr/local/mysource/django"
  code <<-EOH
  activate_env=os.path.expanduser("/home/vagrant/myenv/bin/activate_this.py")
  execfile(activate_env, dict(__file__=activate_env))
  python setup.py install
  EOH
end

3 个回答

0

我不想使用那些已经过时并且没人维护的python/pip厨师食谱,所以我决定手动来做。

  1. 创建一个名为 templates/default/flask_install_with_venv.sh.erb 的脚本,并把它放在某个地方,记得要有 template
#!/bin/bash
source <%= @venv_path %>/bin/activate
pip3 install flask
pip3 install uwsgi
deactivate
template "/tmp/flask_install_with_venv.sh" do
  source "flask_install_with_venv.sh.erb"
  variables ({
    'venv_path' => venv_path
  })
end
  1. 用下面的命令来执行这个脚本:
execute 'flask_install_with_venv' do
  command '/bin/bash /tmp/flask_install_with_venv.sh'
end
2

python_pip 是一个已经不再维护的工具。建议使用 poise-python 代替。

如果你想安装最新的 Python 2 版本,然后用它来创建一个虚拟环境并安装一些软件包,可以按照以下步骤操作:

directory "/opt/myapp" do
  owner "vagrant"
  group "vagrant"
  mode 0755
  action :create
end

python_runtime '2'

python_virtualenv '/opt/myapp/.env'

python_package 'Django' do
  version '1.8'
end

pip_requirements '/opt/myapp/requirements.txt'
4

我使用python_pip这个工具来在虚拟环境中安装Python包。这相当于在命令行中输入pip install -e .

python_pip "/usr/local/mysource/django" do
  virtualenv "/home/vagrant/myenv"
  options '-e'
end

为了在虚拟环境中运行其他命令(比如syncdb、collectstatic等),我通常会使用这个模式:

virtualenv = "/home/vagrant/myenv"
bash "install_website" do
  code "#{virtualenv}/bin/python setup.py install"
  user "vagrant"
  cwd "/usr/local/mysource/django"
end

撰写回答