Python3中使用变量path重定向Shell命令输出到文件失败求助
解决Shell命令输出重定向到指定路径文件的问题
让我来帮你排查并修复代码里的问题,你的代码有几个关键错误导致重定向功能失效,咱们一步步来解决:
问题分析
os.mkdir调用语法错误:原代码里os.mkdir("Directory", path , "Created")完全不符合函数规范,os.mkdir只需要传入要创建的目录路径,提示信息得单独打印。- 路径拼接方式错误:Python中不能直接用
path/'uname'这种类Unix的路径写法(除非用pathlib模块),必须用os.path.join()来正确拼接路径。 os.system重定向写法错误:在Python代码里,"uname -a" > path/'uname'会被当成字符串和路径的比较操作,而不是shell命令的重定向逻辑。你需要把整个命令拼接成完整字符串,让shell去解析执行。
修正后的代码(os.system版本)
import os, subprocess host = os.popen("hostname -s").read().strip() path = "/root/" + host if os.path.exists(path): print(path, "Already exists") else: os.mkdir(path) print(f"Directory {path} Created") # 正确拼接路径并构造完整shell命令 uname_output_path = os.path.join(path, 'uname') os.system(f"uname -a > {uname_output_path}") df_output_path = os.path.join(path, 'df') os.system(f"df -hP > {df_output_path}")
更推荐的subprocess版本(更安全可控)
os.system已经是Python中比较老旧的调用shell命令的方式,推荐使用subprocess模块,它更灵活,还能避免shell注入风险:
import os, subprocess # 用subprocess替代os.popen,更规范 host = subprocess.run(["hostname", "-s"], capture_output=True, text=True).stdout.strip() path = "/root/" + host if os.path.exists(path): print(path, "Already exists") else: os.mkdir(path) print(f"Directory {path} Created") # 直接通过Python文件对象处理输出,无需依赖shell uname_output_path = os.path.join(path, 'uname') with open(uname_output_path, 'w') as f: subprocess.run(["uname", "-a"], stdout=f) df_output_path = os.path.join(path, 'df') with open(df_output_path, 'w') as f: subprocess.run(["df", "-hP"], stdout=f)
关键修改说明
- 修复了
os.mkdir的错误调用,先创建目录再打印创建成功的提示。 - 用
os.path.join()拼接路径,保证在不同操作系统下都能正确生成路径。 - 对于
subprocess版本,直接通过Python的文件句柄重定向输出,不需要启用shell,安全性更高,也更符合Python的编程习惯。
内容的提问来源于stack exchange,提问作者Abhimanyu
相关产品推荐
相关产品推荐

