python - Paramiko 忽略 python 脚本异常
问题描述
我的笔记本电脑上有 python 代码,使用 paramiko 通过远程 RPi 上的 ssh 发送命令。我想运行 2 个 python 脚本:
- create.py :在 RPi 上创建一个小的 json conf 文件
- set.py : 更新这个 conf 文件
帕拉米科代码:
import paramiko
server = "192.168.1.94"
username = "..."
password = "..."
cmd_to_execute = 'cd argparse/; python create.py; python set.py -i test; cat sensor.conf'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server, port=22, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd_to_execute)
print(" ".join(ssh_stdout.readlines()))
ssh.close()
在 set.py 文件中,我使用 argparse 手动配置 conf 文件并允许类似:
python set.py -i 10.10.10.10 -s 2 -r 0
创建.py:
import os
path = "sensor.conf"
with open(path, 'w') as f:
f.write('{"ip": null, "room_id": null, "sensor_id": null}')
set.py 文件:
import argparse
import ipaddress
import json
path = "sensor.conf"
parser = argparse.ArgumentParser(description='Set fields in sensor config file.')
parser.add_argument('-i', '--ip', help='Sensor IP as string (xxx.xxx.xxx.xxx)')
parser.add_argument('-r', '--room', type=int, help='Sensor room ID (integer from server)')
parser.add_argument('-s', '--sensor', type=int, help='Sensor ID (integer from server)')
args = parser.parse_args()
with open(path, 'r') as f:
data = json.load(f)
if args.ip:
try:
ipaddress.IPv4Network(args.ip)
data['ip'] = args.ip
except Exception as e:
print(e)
if args.room or args.room == 0:
data['room_id'] = args.room
if args.sensor or args.sensor == 0:
data['sensor_id'] = args.sensor
with open(path, 'w') as f:
json.dump(data, f)
print(data)
我使用 ipaddress.IPv4Network() 来确保给定的 IP 格式正确,在 try/except 范围内。
当我使用 ssh 手动连接到我的 RPi 并尝试python set.py -i test
处理异常时,我的文件中没有写入任何内容。
但是对于 paramiko,异常似乎没有被处理甚至没有发生?因为我的文件在“ip”字段中包含“test”。
编辑 我找到了一种检查正确 IP 的更好方法,它解决了 paramiko 的问题:如果字符串遵循 IP 地址的格式,我将 try/except 替换为返回 True/False 的函数。
我仍然不明白为什么 try/except 会发生这种情况,知道吗?
非常感谢
解决方案
推荐阅读
- python - Python 正则表达式替换捕获
- python-pptx - Python pptx 点击动作示例
- vbscript - 如何获得最后一次使用 Vbscript 编辑外部 HTML 文档的时间
- aws-code-deploy - 如何停止 aws codepipeline 部署阶段
- python - 使用“multiprocessing.Pool”在多个 GPU 上均匀分配作业
- r - 如何阅读包含弯撇号 (') 的推文
- ruby-on-rails - 带有 select2-rails 输入元素搜索行为的 Ruby on Rails 表单区分大小写
- oracle - Oracle:收到错误“表正在变异”
- css - CSS背景图像未修复
- javascript - 我想从我的 json 文件中带一个值