我使用Python 3.4,并创建了pyvenv,我希望在python进程中激活它。使用virtualenv,我曾经使用activate_this.py
,但这似乎在pyvenv中消失了。
现在有一种简单的方法可以有效地将当前的解释器更改为virtualenv解释器吗?我可能会陷入PATH(这是activate_this.py
所做的),但我想要一种更简单,更稳定的方式。
这适用于wsgi.py。
答案 0 :(得分:7)
pyvenv
和venv
模块不支持开箱即用。第三方virtualenv
包does 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
(调整PATH
,sys.path
,sys.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