使用Paramiko SSH设置virtualenv

tex*_*nic 5 python ssh ubuntu virtualenv paramiko

我在Windows中使用Python和Django的经验有限,现在我想了解如何将代码部署到Ubuntu 16.04 LTS VPS。阅读了关于SE的各种教程和很多答案之后,我设法进行了很长时间(对我而言),但是现在我陷入了困境。

手动(通过腻子)我可以执行以下操作:

# 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) droplet@hostname:~$
# check that python3 is taken from venv
which python3  # /home/droplet/Env/firstsite/bin/python3
Run Code Online (Sandbox Code Playgroud)

因此,虚拟环境已正确创建并打开。我可以继续安装Django。

但是,当我尝试使用Paramiko在自动方式中执行完全相同的操作(我使用执行命令paramiko.SSHClient().exec_command(cmd, input_string, get_pty=False)时,一切都以相同的方式进行,直到最后一条命令为止:

exec_command('which python3')
Run Code Online (Sandbox Code Playgroud)

返回/usr/bin/python3。因此,我认为source activate通过Paramiko的SSH无法正常工作。

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

ale*_*dj2 1

摘自 @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)
Run Code Online (Sandbox Code Playgroud)

就我而言(使用 miniconda 和一个名为 pyODBC 的环境):

stdin, stdout, stderr = ssh.exec_command(~/miniconda2/envs/pyODBC/bin/python run_script.py)
Run Code Online (Sandbox Code Playgroud)

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