我想从Python脚本中激活virtualenv实例。
我知道这很容易,但我见过的所有示例都使用它在env中运行命令然后关闭子进程。
我只是想激活virtualenv并返回shell,就像bin / activate一样。
这样的事情:
$me: my-script.py -d env-name
$(env-name)me:
这可能吗?
相关:
答案 0 :(得分:67)
如果你想在virtualenv下运行一个Python子进程,你可以使用位于virtualenv的/ bin /目录中的python解释器来运行脚本:
# 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解释器而不是子进程下激活virtualenv,可以使用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))
答案 1 :(得分:20)
事实证明,问题并不简单,但解决方案是。
首先,我必须创建一个shell脚本来包装“source”命令。那说我用的是“。”相反,因为我已经读过,使用它比使用bash脚本的源更好。
#!/bin/bash
. /path/to/env/bin/activate
然后从我的python脚本中我可以简单地执行此操作:
import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')
整个技巧都在--rcfile参数中。
当python解释器退出时,将当前shell保留在激活的环境中。
赢!
答案 2 :(得分:19)
在virtualenv的解释器下运行脚本的最简单的解决方案是将默认的shebang行替换为你的virtualenv的解释器的路径,如下所示:
<a href="/link/with/</symbol/in/it">
使脚本可执行:
#!/path/to/project/venv/bin/python
运行脚本:
chmod u+x script.py
瞧!
答案 3 :(得分:8)
要根据官方Virtualenv documentation运行另一个Python环境,在命令行中可以指定可执行python二进制文件的完整路径(不需要之前激活virtualenv):
/path/to/virtualenv/bin/python
如果您想使用virtualenv从命令行调用脚本,同样适用,您不需要在之前激活它:
me$ /path/to/virtualenv/bin/python myscript.py
对于Windows环境(无论是来自命令行还是来自脚本)相同:
> \path\to\env\Scripts\python.exe myscript.py
答案 4 :(得分:6)
只是一个适合我的简单解决方案。我不知道为什么你需要bash脚本基本上做了一个无用的步骤(我错了吗?)
import os
os.system('/bin/bash --rcfile flask/bin/activate')
基本上可以满足您的需求:
[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$
然后只需按Ctrl + D或退出,而不是停用venv 这是一个可能的解决方案还是不是你想要的?
答案 5 :(得分:2)
子进程env在它不再存在的那一刻就丢失了,将环境内容从那里移动到父进程有点棘手。
你可能需要做的是生成一个shell脚本(你可以生成一个动态到/ tmp),它会将virtualenv环境变量输出到一个文件,然后你可以在父Python进程中读取并放到os.environ
或者您只需解析激活脚本,使用for line in line(“bin / activate”)并手动提取内容并放入os.environ。棘手,但并非不可能。
答案 6 :(得分:0)
最佳答案仅适用于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))
答案 7 :(得分:0)
对于python2/3,使用下面的代码片段我们可以激活虚拟环境。
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))
答案 8 :(得分:0)
我遇到了同样的问题,我的环境的 activate_this.py
目录中没有 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
答案 9 :(得分:-2)
您应该在一个文件夹(例如virt)中创建所有virtualenv。
假设您的virtualenv文件夹名称为virt,如果未更改的话
cd
mkdir custom
复制以下行...
#!/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