3

假设我有以下设置:

mkdir test && cd test
virtualenv .venv
source .venv/bin/activate
pip install django
mkdir mod1
touch mod1/__init__.py
echo "a = 1" > mod1/mod2.py

这给了我:

test/.venv
test/mod1/__init__.py
test/mod1/mod2.py

我将如何编写此函数:

def get_module(module_name, root_path, virtualenv_path=None)

为了使它起作用:

project_root_path = "./test"
project_virtualenv_path = "./test/.venv"

get_module("mod1.mod2", project_root_path, project_virtualenv_path)
get_module("django.contrib.auth", project_root_path, project_virtualenv_path)

假设我没有./test/.venv激活。

我想这样做的原因是因为我正在开发一个 vim 插件,该插件将gf在导入语句的 python 文件中实现功能。我也在尝试支持 virtualenvs。

编辑:

此外,脚本不应通过添加或附加到 sys.path 来更改当前运行时。这应该通过 vim python 绑定在 vim 内部运行,我认为更改 vim python 运行时不是一个好主意。

get_module可以返回一个模块对象,也可以返回模块的路径,这就是我基本上要寻找的。

4

2 回答 2

3

您可以在 python 路径上添加您的 virtualenv,例如:

import site 
site.addsitedir('/home/user/.virtualenvs/myapp1/lib/python2.7/site-packages')

然后导入应该工作

于 2012-07-13T13:39:01.090 回答
0

我在这里能找到的唯一实用的解决方案是运行 virtualenv 的activate_this.py脚本,寻找我需要的东西,然后从sys.path.

import sys
import os

old_sys_path = list(sys.path)

virtualenv_path = "/path/to/venv"
activate_this_path = os.path.join(virtualenv_path, "bin", "activate_this.py")

execfile(activate_this_path, dict(__file__=activate_this_path))

# get my module here

# restore sys.path
sys.path = old_sys_path

如果您有更好的答案,请添加它,我会很乐意更改已接受的答案。

于 2012-07-16T09:50:50.627 回答