2016-08-05 64 views
3

我在Python中使用Python和Django的经验有限,现在我正试图了解如何将代码部署到Ubuntu 16.04 LTS VPS。在SE上阅读过各种教程和很多答案后,我设法做得很好(对我来说),但现在我陷入困境。与Paramiko设置virtualenv SSH

手动(通过腻子),我可以做到以下几点:

# check that Python 3.5 is installed 
python3 --version 
# install pip 
sudo -kS apt-get -y install python3-pip 
# upgrade pip to newest version 
pip3 install --upgrade pip 
# check result 
pip3 --version 
# install venv 
sudo -kS pip3 install virtualenv virtualenvwrapper 
# create venv 
virtualenv ~/Env/firstsite 
# make sure venv is created 
ls -l ~/Env/firstsite/bin/python # /home/droplet/Env/firstsite/bin/python3.5 -> python3 
# switch on venv 
source ~/Env/firstsite/bin/activate # (firstsite) [email protected]:~$ 
# check that python3 is taken from venv 
which python3 # /home/droplet/Env/firstsite/bin/python3 

所以虚拟环境正确地创建并打开。我可以继续安装Django。

然而,当我试图做的自动化政权完全一样,使用的paramiko(我执行使用paramiko.SSHClient().exec_command(cmd, input_string, get_pty=False命令),一切都完全一样,直到最后的命令:

exec_command('which python3') 

回报/usr/bin/python3 。所以我认为source activate不能通过Paramiko的SSH工作。

  1. 为什么?
  2. 我该如何应对?
  3. 我可以检查venv是否以某种更直接(可靠)的方式启用?

回答

0

来自@Pablo Navarro的答案在这里:How to source virtualenv activate in a Bash script帮助我解决了同样的问题(在paramiko ssh会话中激活环境)。

在exec_command给环境如内的路径Python可执行程序:

stdin, stdout, stderr = ssh.exec_command(/path/to/env/bin/python script.py) 

在我的情况(使用miniconda和一个名为pyODBC ENV):

stdin, stdout, stderr = ssh.exec_command(~/miniconda2/envs/pyODBC/bin/python run_script.py) 

运行命令~/miniconda2/envs/pyODBC/bin/python -m pip list在此env中打印模块列表以确认