2016-09-26 296 views
0

我创建并安装了virutalenv。我还在我的virutal env中安装了jsnapy工具。如何使用Python在虚拟环境中运行命令

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

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

[email protected]:~/TestAutomation$ python venv.py 
(End2EndAutomation) [email protected]:~/TestAutomation$ ^C 

我们需要知道的,是我们如何能够进入virutalenv,运行一个命令,并使用python脚本停用?

[EDIT1]

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

[email protected]:~/TestAutomation$ python venv.py 
(End2EndAutomation) [email protected]:~/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 

回答

0

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

run.sh

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

的Python

os.system('source run.sh') 

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

+0

它不调用jnapy直到我发出退出虚拟环境。有没有任何有效的方式来做这件事,而不是做一个系统调用。 – srinath

+0

你需要添加更多关于这个问题的信息到你的问题。 – Soviut

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"""]) 

subprocess超过os.system的偏好,即使在os.system documentation建议。

没有必要明确deactivate;当bash命令结束时,这也会隐式地禁用虚拟环境。

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

相关问题