Python 3.6 Windows子进程标准输出重定向至文件失效问题
Windows下Python 3.6 subprocess调用bat文件重定向失效的解决办法
问题分析
你的代码在Linux/MacOS环境正常运行,但Windows下生成的目标文件为空,核心原因大概率是以下两点:
- 工作目录不匹配:subprocess默认继承父进程的工作目录,若
some_file或some_dir是相对路径,可能因找不到文件导致findstr无输出。 - 命令解释器调用方式问题:直接运行bat文件时,部分环境下系统未正确触发cmd.exe解析重定向符号
>,导致输出未写入目标文件。
解决方案
方案1:直接调用cmd执行命令(推荐,无需生成临时bat文件)
去掉生成bat文件的步骤,直接通过cmd.exe /c执行命令,同时指定工作目录确保路径正确:
import os import subprocess if os.name == "nt": # 直接用cmd执行命令,显式指定脚本所在目录为工作目录 cmd = 'findstr something some_file > some_dir/some_file' script_dir = os.path.dirname(os.path.abspath(__file__)) p = subprocess.Popen( ["cmd.exe", "/c", cmd], stderr=subprocess.PIPE, cwd=script_dir ) else: script = 'grep -E something some_file > some_dir/some_file' script_name = 'wat.sh' with open(script_name, 'w') as f: f.write(script + '\n') p = subprocess.Popen(["/bin/sh", script_name], stderr=subprocess.PIPE) stdout, stderr = p.communicate()
方案2:保留bat文件,但显式调用cmd执行
如果必须保留bat文件,修改subprocess调用方式,确保用cmd.exe解析命令:
import os import subprocess if os.name == "nt": script = 'findstr /r something some_file > some_dir/some_file' script_name = 'wat.bat' with open(script_name, 'w') as f: f.write(script + '\n') # 显式调用cmd执行bat文件,指定工作目录 script_dir = os.path.dirname(os.path.abspath(__file__)) p = subprocess.Popen( ["cmd.exe", "/c", script_name], stderr=subprocess.PIPE, cwd=script_dir ) else: script = 'grep -E something some_file > some_dir/some_file' script_name = 'wat.sh' with open(script_name, 'w') as f: f.write(script + '\n') p = subprocess.Popen(["/bin/sh", script_name], stderr=subprocess.PIPE) stdout, stderr = p.communicate()
调试建议
如果问题仍存在,可按以下步骤排查:
- 在bat文件中添加
echo %cd%,运行后查看输出,确认工作目录是否正确。 - 单独在cmd中执行
findstr something some_file,看是否有输出,排查源文件是否存在或目标字符串是否匹配。 - 检查
some_dir是否存在,若不存在需先创建(可在代码中加入os.makedirs("some_dir", exist_ok=True))。
内容的提问来源于stack exchange,提问作者firmament
相关产品推荐
相关产品推荐

