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アクティベートしていないとします。

私がこれをしたい理由はgf、インポートステートメントのpythonファイルに機能を実装するvimプラグインに取り組んでいるためです。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 に答える