2016-09-26 100 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不是交互式的時候它不起作用。

相關問題