如何在python中激活pyvenv vitrualenv? (activate_this.py已被删除?)

时间:2014-12-13 19:08:56

标签: python-3.x mod-wsgi

我使用Python 3.4,并创建了pyvenv,我希望在python进程中激活它。使用virtualenv,我曾经使用activate_this.py,但这似乎在pyvenv中消失了。

现在有一种简单的方法可以有效地将当前的解释器更改为virtualenv解释器吗?我可能会陷入PATH(这是activate_this.py所做的),但我想要一种更简单,更稳定的方式。

这适用于wsgi.py。

3 个答案:

答案 0 :(得分:7)

pyvenvvenv模块不支持开箱即用。第三方virtualenvdoes support this using activate_this.py,但that feature was not included in the built-in venv module

您可以尝试从基于activate_this.py的环境借用virtualenv的副本;它似乎有效,但我不能发誓这将是完美的(venv / pyvenv在启动期间使用一些魔法;不清楚是否所有这些都是通过activate_this.py复制的)。

它的virtualenv文档已经过时了(他们声称你使用了execfile,但它并不存在)。 Python 3兼容的替代方案是:

activator = 'some/path/to/activate_this.py'  # Looted from virtualenv; should not require modification, since it's defined relatively
with open(activator) as f:
    exec(f.read(), {'__file__': activator})

activate_this.py没有什么是神奇的,所以您可以手动执行相同的更改,而无需从virtualenv(调整PATHsys.pathsys.prefix等进行抢劫。),但在这种情况下,借款使其变得更加简单。

答案 1 :(得分:0)

我使用了# the current Python interpreter is not from the virtual environment file = __file__ if file.endswith('.pyc'): file = file[:-1] venv_executable = PROJECT_DIR / 'venv' / 'bin' / 'python' popen = subprocess.Popen([venv_executable, file] + sys.argv[1:]) raise SystemExit(popen.wait()) 本身使用的不同方法:

try {
$stmt = $pdo->prepare('
    SELECT *
    FROM inkoop t10
    WHERE t10.ID_klant = :ID_klant
    AND t10.factuurdatum_timestamp >= :timestamp_start
    AND t10.factuurdatum_timestamp < :timestamp_eind
    GROUP BY t10.ID_inkoop');
$stmt->bindParam(':ID_klant', $ID_klant, PDO::PARAM_INT);
$stmt->bindParam(':timestamp_start', $begin_jaar, PDO::PARAM_INT);
$stmt->bindParam(':timestamp_eind', $eind_jaar, PDO::PARAM_INT);
$stmt->execute();
}

答案 2 :(得分:0)

import argparse
import base64
import os
import zlib
from pathlib import Path


def convert(s):
    b = base64.b64decode(s.encode('ascii'))
    return zlib.decompress(b).decode('utf-8')


ACTIVATE_THIS = convert("""
eJyNU01v2zAMvetXEB4K21jnDOstQA4dMGCHbeihlyEIDMWmE62yJEiKE//7kXKdpEWLzYBt8evx
kRSzLPs6wiEoswM8YdMpjUXcq1Dz6RZa1cSiTkJdr86GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe
5a3p0cRKiEe2NtLAFikftnDco0ko/SFEVgEZ8aRCZDIPY9xbA8pE9M4jfW/B2CjiHq9zbJVZuOQq
siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C+qisSZYiWfjJfs+0/MFMdWn1hJcO5U7G/SLa
xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb
yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF
7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py
m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC
6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw
VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
""")


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--virtualenv-dir', default=os.environ['VIRTUAL_ENV'])

    args = parser.parse_args()

    activate_this_path = Path(args.virtualenv_dir) / 'bin/activate_this.py'

    print(f'Writing activate_this.py to {activate_this_path}')
    with open(activate_this_path, 'w') as fp:
        fp.write(ACTIVATE_THIS)

我是从virtualenv项目本身获得的。 here搜索ACTIVATE_THIS

该脚本会将一个activate_this.py写入您的虚拟环境bin。

有了诗歌,你可以做到:

poetry run python venv_activate_this.py

对于python venv,请执行以下操作:

source venv/bin/activate
python venv_activate_this.py

您可以在任何地方做

python3 venv_activate_this.py --virtualenv-dir /wherever/that/is

现在,您可以将vim与python一起使用,并使它了解如何为ALE和YCM之类的东西激活正确的虚拟环境。

也作为要点存储在这里: https://gist.github.com/nackjicholson/db83869b7931b0bc95fa9e0960921f1c