使用 Python 脚本激活 viralenv

我想从 Python 脚本中激活一个 viralenv 实例。

我知道这很容易做到,但是我看到的所有示例都使用它在 env 中运行命令,然后关闭子进程。

我只是想激活 viralenv 并返回到 shell,就像 bin/active 所做的那样。

就像这样:

$me: my-script.py -d env-name
$(env-name)me:

这可能吗?

相关:

virtualenv › Invoking an env from a script

147411 次浏览

当子进程环境不再存在时,它就会丢失,并且将环境内容从那里移动到父进程有些棘手。

You probably need to spawn a shell script (you can generate one dynamically to /tmp) which will output the virtualenv environment variables to a file, which you then read in the parent Python process and put in os.environ.

或者您可以简单地解析用于 open (“ bin/active”)行的激活脚本,手动提取内容,然后放入 os.environ。这很棘手,但并非不可能。

事实证明,是的,问题并不简单,但解决方案是。

首先,我必须创建一个 shell 脚本来包装“ source”命令。说我用了“相反,因为我读到过使用它比为 Bash 脚本提供源代码更好。

#!/bin/bash
. /path/to/env/bin/activate

Then from my Python script I can simply do this:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

整个技巧在于 --rcfile参数。

当 Python 解释器退出时,它将当前 shell 留在激活的环境中。

赢了!

If you want to run a Python subprocess under the virtualenv, you can do that by running the script using the Python interpreter that lives inside virtualenv's /bin/ directory:

import subprocess


# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"


# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"


subprocess.Popen([python_bin, script_file])

然而,如果你想在当前 Python 解释器下激活 viralenv 而不是子进程,你可以使用 activate_this.py脚本:

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"


execfile(activate_this_file, dict(__file__=activate_this_file))

只是一个对我有用的简单解决方案。我不知道为什么你需要 Bash 脚本,它基本上做了一个无用的步骤(我错了吗?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

它基本上满足了你的需求:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

然后不要关闭虚拟环境,只需要 Ctrl + D或退出。这是一个可能的解决办法还是这不是你想要的?

To run another Python environment according to the official Virtualenv documentation, in the command line you can specify the full path to the executable Python binary, just that (no need to active the virtualenv before):

/path/to/virtualenv/bin/python

如果希望使用 viralenv 从命令行调用脚本,也可以使用同样的方法。你不需要先激活它:

me$ /path/to/virtualenv/bin/python myscript.py

对于 Windows 环境(无论是从命令行还是从脚本)也是如此:

> \path\to\env\Scripts\python.exe myscript.py

在 viralenv 的解释器下运行脚本的最简单的解决方案是在脚本的开始部分将默认的 shebang 行替换为指向 viralenv 解释器的路径,如下所示:

#!/path/to/project/venv/bin/python

使脚本可执行:

chmod u+x script.py

运行脚本:

./script.py

瞧!

您应该在一个文件夹中创建所有的 virtualenv,例如 virt

假设你的 viralenv 文件夹名是 virt,如果没有改变它

cd
mkdir custom

Copy the below lines...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

创建一个 shell 脚本文件并粘贴以上代码行..。

touch custom/vhelper
nano custom/vhelper

授予文件可执行权限:

sudo chmod +x custom/vhelper

现在导出该自定义文件夹路径,以便您可以通过单击选项卡在命令行上找到它..。

Export PATH = $PATH: “ $HOME/custom”

现在您可以在任何地方使用它,只需键入以下命令..。

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

假设它是 abc 然后..。

vhelper abc

上面的答案只适用于 Python2.x

对于 Python 3.x,使用以下方法:

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"


exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

参考资料: What is an alternative to execfile in Python 3?

对于 python2/3,使用下面的代码片段我们可以激活虚拟 env。

activate_this = "/home/<--path-->/<--virtual env name -->/bin/activate_this.py" #for ubuntu
activate_this = "D:\<-- path -->\<--virtual env name -->\Scripts\\activate_this.py" #for windows
with open(activate_this) as f:
code = compile(f.read(), activate_this, 'exec')
exec(code, dict(__file__=activate_this))

我遇到了同样的问题,在我的环境的 Scripts目录中没有 activate_this.py

激活这个

"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""


try:
__file__
except NameError:
raise AssertionError(
"You must run this like execfile('path/to/active_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os


base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
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')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path

将该文件复制到环境的 Scripts目录,并像下面这样使用它:

def activate_virtual_environment(environment_root):
"""Configures the virtual environment starting at ``environment_root``."""
activate_script = os.path.join(
environment_root, 'Scripts', 'activate_this.py')
execfile(activate_script, {'__file__': activate_script})


activate_virtual_environment('path/to/your/venv')

参考资料: https://github.com/dcreager/virtualenv/blob/master/virtualenv_support/activate_this.py