Ubuntu虚拟机中GNS3关联Python脚本执行异常求助
修复后的脚本及问题解析
完整修复代码
#!/usr/bin/python3 import subprocess import os # 统一处理输入:去除空格+转为大写,避免大小写/空格导致的匹配失败 user_input = input("Enter RYU, ONOS or CURL:").strip().upper() print(f"Command entered was: {user_input}") # 替换为你RYU脚本的实际绝对路径 RYU_SCRIPT_DIR = "/home/your_username/ryu_scripts" rest_router_path = os.path.join(RYU_SCRIPT_DIR, "rest_router.py") gui_topology_path = os.path.join(RYU_SCRIPT_DIR, "gui_topology.py") if user_input == 'RYU': # 用绝对路径调用脚本,避免找不到文件 subprocess.run(["python3", rest_router_path], check=True) subprocess.run(["python3", gui_topology_path], check=True) elif user_input == "ONOS": # 保持ONOS启动命令的绝对路径,用subprocess替代os.system subprocess.run(["sudo", "/opt/onos/bin/onos-service", "start"], check=True) elif user_input == "CURL": # 替换为你实际的curl命令,用列表形式传递参数避免语法错误 curl_command = ["curl", "-X", "GET", "http://your-target-url"] subprocess.run(curl_command, check=True) else: print("Invalid input. Please enter RYU, ONOS or CURL.")
逐个问题的修复说明
1. if语句失效的修复
- 原代码错误地使用内置函数
input做判断,而非存储用户输入的变量Code,直接将判断对象改为存储输入的变量(重命名为user_input更清晰)。 - 增加
.strip().upper()处理,兼容用户输入空格、小写等情况(比如输入ryu或Ryu都能触发RYU分支)。
2. Python文件找不到的修复
- 绝对路径调用:直接使用脚本的完整绝对路径(比如
/home/xxx/rest_router.py),彻底摆脱对当前工作目录的依赖,避免cd命令的繁琐操作。 - 权限检查:确保脚本有执行权限,执行
chmod +x /path/to/rest_router.py赋予权限(如果用python3直接调用可跳过,但绝对路径更稳妥)。 - 可选:如果脚本依赖所在目录的其他文件,可通过
subprocess.run的cwd参数指定工作目录,例如:subprocess.run(["python3", "rest_router.py"], cwd="/home/your_username/ryu_scripts", check=True)
3. CURL命令语法报错的修复
- 放弃
os.system,改用subprocess.run的列表参数形式传递curl命令:将每个命令拆分为列表元素(比如["curl", "-X", "GET", "url"]),避免shell解析时的特殊字符转义问题,这也是Python官方推荐的安全方式。 - 如果你的curl命令需要复杂参数(比如请求头、POST数据),直接按列表拆分即可,示例:
curl_command = ["curl", "-H", "Content-Type: application/json", "-X", "POST", "-d", '{"key":"value"}', "http://target-url"]
额外优化建议
- 用
subprocess.run替代os.system:os.system无法捕获命令输出和返回码,subprocess模块更灵活、安全,还能通过check=True在命令失败时抛出异常,便于调试。 - 添加错误处理:可以用
try-except块捕获subprocess.CalledProcessError,处理命令执行失败的情况,示例:try: subprocess.run(["python3", rest_router_path], check=True) except subprocess.CalledProcessError as e: print(f"RYU脚本执行失败: {e}")
内容的提问来源于stack exchange,提问作者Brodie Anderson
相关产品推荐
相关产品推荐

