在Windows的fabfile中使用activate_this.py激活Python虚拟环境

4 投票
2 回答
9203 浏览
提问于 2025-04-15 21:38

我有一个Fabric任务,需要访问我Django项目的设置。

在Windows上,我无法把Fabric安装到项目的虚拟环境中(因为Paramiko和pycrypto的依赖问题)。不过,我可以在系统的全局包中安装Fabric,没问题。

我已经在项目的虚拟环境中安装了Django,当我用“VIRTUALENV\Scripts\activate.bat”脚本激活虚拟环境时,可以轻松使用所有的“> python manage.py”命令。

我在项目中有一个fabric任务文件(fabfile.py),里面提供了设置、测试、部署等任务。有些任务需要通过“from django.conf import settings”来访问Django项目的设置。

因为我唯一能用的Fabric安装在系统的全局包中,所以我需要在fabfile中激活虚拟环境,这样Django才能可用。为此,我使用项目虚拟环境的“activate_this”模块,以便访问项目的设置等。通过在执行activate_this.py之前和之后使用“print sys.path”,我可以看到Python的路径变成指向项目的虚拟环境了。但是,我仍然无法导入django.conf.settings。

我在*nix(Ubuntu和CentOS)和Cygwin上成功做到过这一点。你在Windows上使用这种设置/工作流程吗?如果是的话,你能帮我找出为什么在Windows上不行,或者提供一些解决这个问题的技巧吗?

谢谢,祝好。


参考:

本地开发环境:

  • Python 2.5.4
  • Virtualenv 1.4.6
  • Fabric 0.9.0
  • Pip 0.6.1
  • Django 1.1.1
  • Windows XP (SP3)

2 个回答

2

你需要在fab文件里面执行这个激活操作。虽然我没有测试过,但我觉得下面的代码应该可以用:

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
6

经过一些调查,我发现这个问题出在activate_this.py这个脚本上。在当前的版本中,虚拟环境工具virtualenv<=1.4.6假设所有平台的site-packages目录路径是一样的。但是,*nix类平台和Windows的site-packages目录路径是不同的。

在这种情况下,activate_this.py脚本添加了*nix风格的路径:

VIRTUALENV_BASE/lib/python2.5/site-packages/

而不是Windows特有的路径:

VIRTUALENV_BASE\Lib\site-packages\

我在virtualenv的问题追踪器上创建了一个问题,详细说明了这个问题和解决方案。如果你感兴趣,可以在这里查看这个问题:http://bitbucket.org/ianb/virtualenv/issue/31/windows-activate_this-assumes-nix-path-to-site

希望这个问题能在即将发布的virtualenv版本中得到修复。


如果你现在需要解决这个问题,而virtualenv包还没有修复,你可以按照下面的方法“修复”你自己的activate_this.py。

编辑你的VIRTUALENV\Scripts\activate_this.py文件。将第17行(可能是第17行):

site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')

改成

if sys.platform == 'win32':
    site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')

这样一来,你的activate_this.py脚本会先检查它运行在哪个平台,然后调整site-packages目录的路径以适应。

祝你好运!

撰写回答