如何使用Python在虚拟环境中运行命令

时间:2016-09-26 16:12:06

标签: python

我已经创建并安装了virutalenv。我还在我的虚拟环境中安装了jsnapy工具。

这是我们正在使用的脚本:

Filename : venv.py 
import os
os.system('/bin/bash  --rcfile ~/TestAutomation/End2EndAutomation/bin/activate')
os.system('End2EndAutomation/bin/jsnapy')

ubuntu@server:~/TestAutomation$ python venv.py
(End2EndAutomation) ubuntu@sdno-server:~/TestAutomation$ ^C

我们需要知道,我们如何进入virutalenv,运行命令并使用python脚本停用它?

[EDIT1]

我使用了评论中给出的代码。它只是进入了虚拟的环境。当我发出exit时,它正在运行jsnapy命令。

ubuntu@server:~/TestAutomation$ python venv.py
(End2EndAutomation) ubuntu@server:~/TestAutomation$ exit
exit
usage:
This tool enables you to capture and audit runtime environment of
networked devices running the Junos operating system (Junos OS)

Tool to capture snapshots and compare them
It supports four subcommands:
 --snap, --check, --snapcheck, --diff
1. Take snapshot:
        jsnapy --snap pre_snapfile -f main_configfil

2 个答案:

答案 0 :(得分:0)

每次调用os.system()都会创建一个新的bash实例并终止前一个实例。要在一个bash实例中运行所有命令,您可以将所有命令放在一个bash脚本中,并从os.system()

调用它

<强> run.sh

source ~/TestAutomation/End2EndAutomation/bin/activate
End2EndAutomation/bin/jsnapy
deactivate

<强>的Python

os.system('source run.sh')

或者,您可以编写多行bash命令,只要它在一个os.system()调用中即可。

答案 1 :(得分:0)

os.system()的两次连续调用将创建两个独立的进程,一个接一个。第二个将在第一个完成时运行。第二个运行时,第一个进程中执行的命令的任何影响都将被遗忘并刷新。

您希望在同一进程中运行需要在virtualenv中运行的激活和命令,即同一个shell实例。

为此,您可以使用bash -c '...'运行一系列命令。见下文。

但是,更好的解决方案是简单地从Python本身激活虚拟环境。

p = os.path.expanduser('~/TestAutomation/End2EndAutomation/bin/activate_this.py')
execfile(p, dict(__file__=p))
subprocess.check_call(['./End2EndAutomation/bin/jsnapy'])

为了完整性,这里是Bash解决方案,带有注释。

import subprocess
subprocess.check_call(['bash', '-c', """
    . ~/TestAutomation/End2EndAutomation/bin/activate
    ./End2EndAutomation/bin/jsnapy"""])

即使在os.system documentation中,也建议优先subprocess优先于os.system

无需明确deactivate;当bash命令完成时,这将隐式地停用虚拟环境。

--rcfile技巧是一个不错的主意,但是当你调用的shell不是交互式时它不起作用。

相关问题