使用Python脚本激活virtualenv

使用Python脚本激活virtualenv,python,virtualenv,Python,Virtualenv,我想从Python脚本激活virtualenv实例 我知道这很容易做到,但我看到的所有示例都使用它在env中运行命令,然后关闭子流程 我只想激活virtualenv并返回shell,就像bin/activate一样 大概是这样的: $me: my-script.py -d env-name $(env-name)me: 这可能吗 相关: 子进程环境在它停止存在的那一刻就消失了,将环境内容从那里移动到父进程有点棘手 您可能需要生成一个shell脚本(可以动态生成一个脚本到/tmp),该脚本将Vi

我想从Python脚本激活virtualenv实例

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

我只想激活virtualenv并返回shell,就像bin/activate一样

大概是这样的:

$me: my-script.py -d env-name
$(env-name)me:
这可能吗

相关:


子进程环境在它停止存在的那一刻就消失了,将环境内容从那里移动到父进程有点棘手

您可能需要生成一个shell脚本(可以动态生成一个脚本到/tmp),该脚本将VirtualEnvironment变量输出到一个文件中,然后在父Python进程中读取该文件并将其放入os.environ


或者您只需在using中为open中的行(“bin/activate”)解析激活脚本,手动提取内容,然后放入os.environ。这很棘手,但并非不可能。

事实证明,问题并不简单,但解决办法却很简单

首先,我必须创建一个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留在激活的环境中


如果要在virtualenv下运行Python子流程,可以使用virtualenv的/bin/目录中的Python解释器运行脚本:

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解释器下而不是子流程下激活virtualenv,可以使用
activate\u 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脚本,它基本上只执行一个无用的步骤(我错了吗?)

这基本上满足了您的需求:

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

然后,不要停用虚拟环境,只需按住Ctrl+D键或退出即可。这是一个可能的解决方案还是不是您想要的?

根据官方的说法,要运行另一个Python环境,您可以在命令行中指定可执行Python二进制文件的完整路径,仅此而已(之前无需激活virtualenv):

如果要使用virtualenv从命令行调用脚本,同样适用。您无需在以下时间之前激活它:

me$ /path/to/virtualenv/bin/python myscript.py
Windows环境也是如此(无论是从命令行还是从脚本):


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

#!/path/to/project/venv/bin/python
./script.py
使脚本可执行:

chmod u+x script.py
运行脚本:

#!/path/to/project/venv/bin/python
./script.py

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

假设您的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
现在导出自定义文件夹路径,以便通过单击tab在命令行上找到它

导出路径=$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))

参考:

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

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))
activate_this=“/home///bin/activate_this.py”#对于ubuntu
为windows激活\u this=“D:\\\Scripts\\activate\u this.py”
打开(激活此)作为f:
代码=编译(f.read(),激活此“exec”)
exec(代码,dict(_文件_=activate_this))

你的意思是这样的?我真的不明白。为什么不这样做呢:
os.system('/bin/bash--rcfile path/to/env/activate')
bash实例启动时,它将.bashrc作为--rcfile的参数。所以只需指定rcfile是您的激活文件。。。否?@Depado我刚刚尝试了您的解决方案,这将激活python中的shell。至少当我在贝壳里试的时候系统('/bin/bash--rcfile/var/envs/test/bin/activate')(测试)tcraig@tallis-桌面:~$(测试)tcraig@tallis-桌面:~$ls-l总计706288可能,但这在脚本中起作用。使用这种技术唯一不方便的地方是,您无法获得所有别名以及~/.bashrc中的所有内容。但我同意。例如,“ls”命令没有颜色。但一切都对我有用。当我想离开时,我只需Ctrl+D“当python解释器退出时,它会离开激活环境中的当前shell”什么?它生成一个全新的shell作为子进程,并等待它完成。为了避免在我的存储库中创建更多的新文件,也为了复制当前的bash配置,我这样做:
cat~/.bashrc env/bin/activate>env/bin/activate2&/bin/bash--rcfile env/bin/activate2
/,这个答案的第一个代码块的最后一行不应该是这样的:
subprocess.Popen([venv\u python\u file,script\u file])
?/,还有,有没有办法从任意位置运行
script\u文件
,或者它必须在
virtualenv
目录中?修复了,感谢您注意到错误。至于你的第二个问题,没有
script\u文件
不必在virtualenv目录中,它可以在任何地方。如果我使用第二个选项,我如何停用虚拟环境?如何使用第二个选项和python3?看起来exec已经取代了python3中的execfile,但我无法让它工作。+1表示优雅。注意:在windows上,这需要一个兼容posix的环境,该环境能够理解诸如cygwin或msysWorks for python 3.6.3和windows 10之类的shebang代码!这
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))