我有一个 Flask
app.py
,我正在本地计算机上开发。
Flask 应用程序使用连接到远程计算机的串行接口 (pyserial)。
我设置 PyCharm 以在远程计算机上进行远程部署机器。
当我远程(从本地机器)部署和运行应用程序时,我想在独立的
screen
中启动它,以便我可以在需要时断开与 SSH 的连接。
为此,我写了这个简单的 python 脚本
detach_app.py
:
import sys
import subprocess
import shlex
command = "/opt/homebrew/bin/screen -S flask -d -m " + sys.executable + " app.py"
command = shlex.split(command)
subprocess.Popen(command, start_new_session=True)
当我在 PyCharm 中远程部署时
detach_app.py
它在屏幕中运行
app.py
并分离屏幕。它还将屏幕分配给一个新会话,以便它成为
init
进程的子进程,并且在 python 脚本结束时不会被关闭。
这很有效,因为如果我稍后需要检查进程我只是通过 PyCharm 中的终端 SSH 进入机器并执行
screen -r flask
但是,我遇到了一个奇怪的问题,当我通过此方法启动
app.py
时,串行接口行为异常。特别是,设备能够打开串行端口,但它只会发送空字符串。
请注意,如果满足以下条件,则不会发生此行为:
-
我远程部署
app.py
-
我本地启动
app.py
自行或者through screen
-
我远程部署
detach_app.py
但没有使用screen
我使用nohup
看来串行接口问题是由屏幕和PyCharm远程部署的组合引起的。 我知道这是一个牵强的问题,但我真的很难理解下一步要尝试调查这个问题会是什么。
有人对此有任何指示吗?
这个问题确实很棘手,因为问题似乎出现在 PyCharm 远程部署,
screen
和串口通信三者交互时。
以下是一些可能导致此问题的原因以及可以尝试的故障排除步骤:
1. 串口权限问题:
-
screen
会话可能以不同的用户身份运行,该用户没有访问串口的权限。 -
解决方案:
尝试在
detach_app.py
中使用os.setuid(0)
和os.setgid(0)
切换到 root 用户,然后再启动screen
会话。 注意: 使用 root 用户运行代码存在安全风险,请谨慎操作。
2. TTY 设置问题:
-
screen
默认情况下会更改终端设置,这可能会影响串口通信。 -
解决方案:
-
尝试在
screen
命令中添加-t
选项,以强制分配一个伪终端:python command = "/opt/homebrew/bin/screen -S flask -d -m -t flask " + sys.executable + " app.py"
-
尝试在
app.py
中使用pyserial
库打开串口时,指定xonxoff=False
和rtscts=False
参数,以禁用流控制。
-
尝试在
3. 环境变量问题:
-
PyCharm 远程部署可能会设置一些环境变量,这些变量会影响
screen
会话中的串口通信。 -
解决方案:
-
尝试在
detach_app.py
中打印出相关的环境变量,例如TERM
,PATH
等,并与直接在远程机器上运行screen
会话时的环境变量进行比较。 -
如果发现差异,尝试在
detach_app.py
中设置相应的环境变量。
-
尝试在
4. PyCharm 远程部署的特殊设置:
- PyCharm 远程部署可能有一些特殊设置或行为,影响了串口通信。
-
解决方案:
-
尝试使用其他远程部署工具,例如
Fabric
或Paramiko
,看看问题是否仍然存在。 - 查阅 PyCharm 的文档或联系 JetBrains 支持,了解有关 PyCharm 远程部署的更多信息。
-
尝试使用其他远程部署工具,例如
其他建议:
- 简化环境: 尝试创建一个最小的示例程序,只包含打开串口并发送数据的代码,以便更容易地隔离问题。
-
使用日志记录:
在
app.py
中添加详细的日志记录,以便更好地了解程序执行过程以及串口通信的情况。 -
逐步调试:
尝试逐步调试
detach_app.py
和app.py
,以查看程序在何处出现问题。
希望这些步骤可以帮助找到问题的根源。 如果仍然遇到问题,请提供更多信息,例如:
- 的 PyCharm 版本
- 的操作系统版本
-
的
pyserial
版本 - 正在使用的串口设备
-
的
app.py
代码片段 - 任何相关的错误消息
这将有助于我更好地理解的问题并提供更具体的帮助。
标签:python,ssh,pycharm,screen,pyserial From: 78777057