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

时间:2010-04-15 08:04:02

标签: python django windows-xp virtualenv fabric

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

在Windows上,我无法将Fabric安装到项目的virtualenv中(Paramiko + pycrypto deps的问题)。但是,我可以在我的系统范围的站点包中安装Fabric,没问题。

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

我的项目中有一个结构任务文件(fabfile.py),它提供设置,测试,部署等任务。我的fabfile中的一些任务需要通过“来自django来访问我的django项目的设置。 conf导入设置“。

由于我所拥有的唯一可用的Fabric安装在我的系统范围的站点包中,我需要在fabfile中激活virtualenv,以便django可用。为此,我使用项目virtualenv的“activate_this”模块来访问项目设置等。在执行activate_this.py之前和之后使用“print sys.path”,我可以告诉python路径更改指向项目的virtualenv。但是,我仍然无法导入django.conf.settings。

我已经能够在* nix(Ubuntu和CentOS)和Cygwin上成功完成此操作。您是否在Windows上使用此设置/工作流程?如果是这样你能帮我弄清楚为什么这不适用于Windows或提供任何提示和技巧来解决这个问题?

谢谢,干杯。


REF:

本地开发环境:

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

2 个答案:

答案 0 :(得分:6)

经过一番挖掘,我发现这是 activate_this.py 脚本的问题。在当前状态virtualenv< = 1.4.6中,此脚本假定site-packages目录的路径对于所有平台都是相同的。但是, site-packages 目录的路径在* nix(如平台和Windows)之间有所不同。

在这种情况下,activate_this.py脚本会添加* nix样式路径:

VIRTUALENV_BASE / LIB /的python2.5 /站点包/

到python路径而不是Windows特定路径:

VIRTUALENV_BASE \ LIB \站点包\

我在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?):

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目录的路径以适应。

享受!

答案 1 :(得分:2)

您必须从fab文件中执行activate this。 Altho'我没有测试过,我认为以下应该可以工作:

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