我想远程运行本地 python 脚本,但首先激活远程计算机中的正确环境。例如,如果在本地运行我会这样做:
source activate myenv
python myscript.py
我想我可以使用 ssh 来做到这一点,如下所示:
ssh user@host "source activate myenv && python" < ./myscript.py
然而,这似乎不起作用。它产生错误消息:
bash: activate: No such file or directory
做这样的事情最好的方法是什么?
答案1
如果您只想执行脚本并退出,则无需激活虚拟环境。激活虚拟环境只是通过调整PATH
1来替换 python 可执行文件的便捷方法。所以,命令
$ source path/to/myenv/bin/activate
$ python myscript.py
$ deactivate
可以有效地替换为
$ path/to/myenv/bin/python myscript.py
因此,当通过 运行脚本时ssh
,只需选择 s python 可执行文件的正确路径myenv
即可:
$ ssh user@host "path/to/myenv/bin/python" < ./myscript.py
1除此之外,VIRTUAL_ENV
设置环境变量并将环境名称添加到PS1
.
答案2
我最近(2022 年 7 月)遇到了类似的问题。我试图在运行 Django 的远程生产服务器上进行一些维护。
我可以手动执行此操作,但通过脚本执行此操作很困难。
ssh user@host
cd DjangoFolder
pipenv shell
python manage.py migrate
我试过
ssh user@host "/pathTo/python3 /separatePathTo/manage.py migrate"
它负责查找适当的 python 和 manage.py,但路径中没有虚拟环境位置(已安装的软件包需要它)。
最终对我有用的解决方案是
ssh user@host "cd DjangoFolder; pipenv run python manage.py migrate;"
有几点需要注意:
- “pipenv run”正在我使用“pipenv shell”创建的适当虚拟环境中运行我的命令
- “cd DjangoFolder”正在进入适当的文件夹,以便pipenv激活正确的虚拟环境
- 在同一个 shell 实例中包含这两个命令 (将它们放在同一个字符串中,并用分号分隔),保留两个命令之间的上下文非常重要。
答案3
如果可以source activate myenv
在shell中执行,那么activate一定是$PATH
.找到该文件并指定完整路径。它必须存在于远程计算机上。或者了解此激活脚本的作用,然后将作业发送到远程计算机。