首页 > 解决方案 > Paramiko 忽略 python 脚本异常

问题描述

我的笔记本电脑上有 python 代码,使用 paramiko 通过远程 RPi 上的 ssh 发送命令。我想运行 2 个 python 脚本:

帕拉米科代码:

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 会发生这种情况,知道吗?

非常感谢

标签: pythonexceptionsshparamiko

解决方案


推荐阅读