在Windows的fabfile中使用activate_this.py激活Python虚拟环境
我有一个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上不行,或者提供一些解决这个问题的技巧吗?
谢谢,祝好。
参考:
- http://virtualenv.openplans.org/#id9 | 在不使用 bin/python的情况下使用Virtualenv
本地开发环境:
- Python 2.5.4
- Virtualenv 1.4.6
- Fabric 0.9.0
- Pip 0.6.1
- Django 1.1.1
- Windows XP (SP3)
2 个回答
你需要在fab文件里面执行这个激活操作。虽然我没有测试过,但我觉得下面的代码应该可以用:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
经过一些调查,我发现这个问题出在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目录的路径以适应。
祝你好运!