如何通过Python借助SSH永久启动远程Python进程?
解决远程SSH启动Python脚本时的语法错误问题
核心原因
你遇到的SyntaxError是因为远程SSH会话默认使用的Python版本过低:def handle_client(self, connfd: socket.socket)这种函数参数类型注解是Python 3.5及以上才支持的语法,你本地用的3.11.4完全兼容,但远程环境调用了不支持该语法的旧版本Python(比如Python 2.x或3.4及以下)。
解决方法
1. 显式指定兼容的Python解释器路径
直接在远程命令中使用你本地工作的那个Python解释器绝对路径(即本地进程里的/home/pi/.pyenv/versions/3.11.4/bin/python),修改subprocess的命令:
cmd = ["ssh", target, f"nohup /home/pi/.pyenv/versions/3.11.4/bin/python {Conf.FILES[0]} 1>./Server.log 2>&1 &"]
这样能强制远程使用指定的高版本Python,避免调用系统默认的旧版本。
2. 先确认远程环境的Python版本(可选但推荐)
先远程执行命令排查环境,确认可用的Python版本和路径:
ssh target "python --version; python3 --version; which python; which python3"
也可以在Python代码中用subprocess执行这个命令,确保你指定的解释器路径在远程机器上确实存在。
3. 优化后台进程的稳定性
用&让进程后台运行时,SSH会话断开可能会导致进程被终止,可以加上disown或者用setsid提升可靠性:
- 用
disown:cmd = ["ssh", target, f"nohup /home/pi/.pyenv/versions/3.11.4/bin/python {Conf.FILES[0]} 1>./Server.log 2>&1 & disown"] - 用
setsid:cmd = ["ssh", target, f"setsid nohup /home/pi/.pyenv/versions/3.11.4/bin/python {Conf.FILES[0]} 1>./Server.log 2>&1 &"]
验证方法
启动后可以远程查看进程,确认使用的是指定的Python版本:
ssh target "ps aux | grep Server.py"
内容的提问来源于stack exchange,提问作者RyderHook
相关产品推荐
相关产品推荐

