Cisco Packet Tracer中Python代码无法运行解决方案咨询
Cisco Packet Tracer 运行Python脚本失败解决方案
核心故障原因
- Cisco Packet Tracer(以下简称PT)内置的是裁剪版MicroPython运行环境,并非PC端完整的CPython环境,大量Python标准库未内置,你代码中导入的
ipaddress模块在PT环境中不存在,导入阶段就会抛出模块不存在的错误。 - 你当前贴出的代码存在基础语法错误:Python为强制缩进语法,你贴出的版本中所有函数内部逻辑、if/for循环下属代码块全部顶格书写,直接运行会触发
IndentationError,你在其他平台能正常运行是因为本地存储的源文件保留了正确缩进,粘贴时格式丢失。 - PT环境的文件系统为虚拟沙箱,不支持你代码中写的相对路径读写本地文本文件的逻辑,强行调用会触发权限/路径不存在错误。
- PT的Python脚本并非像本地环境一样直接运行.py文件,需要绑定到拓扑内的网络设备上执行,直接拖拽本地.py文件到PT中无法运行。
提交pkt文件的操作步骤
- 打开PT软件,从底部设备栏拖拽1台PC终端到空白拓扑画布上。
- 双击画布上的PC设备,弹出配置窗口后切换到Programming标签页,在左侧语言列表选择Python,进入PT内置的Python编辑界面。
- 将原代码中不兼容PT环境的部分修改:
- 删除
import ipaddress导入语句,自行实现整数格式IPv4转点分十进制的逻辑,不依赖缺失的标准库 - 补全所有代码块的缩进,函数、条件判断、循环下属代码统一缩进4个空格
- 删除读写
conversion.txt的中转逻辑,直接在内存中存储校验后的IP列表,避免沙箱文件系统报错
- 将修改后的代码粘贴到PT的代码编辑区,点击编辑区下方的Run按钮测试,确认输入10个IP后可以正常输出各进制转换结果。
- 点击PT左上角保存按钮,将拓扑存储为pkt格式文件即可提交。
适配PT环境的可直接运行代码
def in_range(n): if n >= 0 and n<=255: return True return False def has_leading_zero(n): if len(n)>1: if n[0] == "0": return True return False def int_to_ip(int_ip): # 替代ipaddress库的整数转点分IPv4逻辑 bin_ip = bin(int(int_ip))[2:].zfill(32) return '.'.join([str(int(bin_ip[i:i+8],2)) for i in range(0,32,8)]) def isValid(s): # 先判断是不是整数格式的IP if s.isdigit(): try: int_s = int(s) if 0 <= int_s <= 2**32-1: return 2 # 标记为整数格式IP except: pass s = s.split(".") if len(s) != 4: return 0 for n in s: if has_leading_zero(n): return 0 if len(n) == 0: return 0 try: n = int(n) if not in_range(n): return 0 except: return 0 return 1 def hexadecimal(ip): parts=ip.split('.') hexNumber= format(int(parts[0]), '02X') \ + format(int(parts[1]), '02X') \ + format(int(parts[2]), '02X') \ +format(int(parts[3]), '02X') return hexNumber def binary(ip): parts=ip.split('.') binaryNumber= format(int(parts[0]), '08b') \ + format(int(parts[1]), '08b') \ + format(int(parts[2]), '08b') \ +format(int(parts[3]), '08b') return binaryNumber def octal(ip): parts=ip.split('.') octalNumber= format(int(parts[0]), '03o') \ + format(int(parts[1]), '03o') \ + format(int(parts[2]), '03o') \ +format(int(parts[3]), '03o') return octalNumber def decimal(ip): parts=ip.split('.') decimalNumber= format(int(parts[0]), '03d') \ + format(int(parts[1]), '03d') \ + format(int(parts[2]), '03d') \ +format(int(parts[3]), '03d') return decimalNumber def conversions(ip): a=decimal(ip) b=binary(ip) c=octal(ip) d=hexadecimal(ip) return a, b, c, d if __name__=="__main__": print("Input 10 ipv4 addresses") ip_list=[] n=10 for i in range(0, n): ip=input().strip() check_res = isValid(ip) if check_res == 1: ip_list.append(ip) elif check_res == 2: ip_list.append(int_to_ip(ip)) else: # 非法IP默认填0.0.0.0,可根据考核要求调整 ip_list.append("0.0.0.0") for idx, ip in enumerate(ip_list): print(f"The {idx+1} IP address in Decimal, Binary, Octal and hexadecimal format is {conversions(ip)} \n")
注意:如果考核要求必须保留文件输出逻辑,可以将文件路径改为PT虚拟系统的绝对路径
flash:/conversion.txt,不要用本地系统的相对路径。
内容的提问来源于stack exchange,提问作者vri
相关产品推荐
相关产品推荐

