使用os.popen执行copy命令后生成空文件的原因排查
为何用os.popen执行copy命令后得到空文件?
这个问题我之前排查过类似的情况,咱们一步步拆解问题根源:
核心问题1:字符串转义导致路径失效
你代码里的路径用了普通字符串的\,但在Python中\是转义字符,比如\W、\i这类组合会被解析成特殊字符,导致实际传递给copy命令的路径和你写的完全不一样。举个例子,C:\Winusr会被Python解析成C:Winusr(因为\W被转义了),直接让copy命令找不到源文件。
核心问题2:带空格的路径未加引号
源路径里的issue wintrace目录包含空格,直接在CMD命令里写的话,CMD会把空格当成参数分隔符,把路径拆成C:\Winusr\issue和wintrace\west\Wintrace.log两个部分,自然找不到正确的源文件。
核心问题3:未检查命令执行状态
你代码里不管copy命令是否成功,都会打印success——os.popen执行后不会主动抛出错误,你需要读取它的输出或者检查返回码,才能知道命令是否真的执行成功了。
修正后的代码方案
方案1:修复os.popen的写法(不推荐,因为os.popen已被官方废弃)
import os # 用原始字符串r""避免转义,同时给带空格的路径加双引号 source = r"C:\Winusr\issue wintrace\west\Wintrace.log" target = r"C:\Winusr\wintrace1.log" if os.path.exists(source): # 给路径套双引号,解决空格拆分问题 cmd = f'copy "{source}" "{target}"' f = os.popen(cmd) # 打印命令输出,方便排查错误 print("命令执行输出:", f.read()) f.close() print("success") else: print("fail")
方案2:用官方推荐的subprocess模块(更安全可靠)
os.popen已经被Python官方标记为废弃,推荐用subprocess.run来执行外部命令,它会自动处理带空格的路径,还能直接获取执行状态:
import os import subprocess source = r"C:\Winusr\issue wintrace\west\Wintrace.log" target = r"C:\Winusr\wintrace1.log" if os.path.exists(source): # shell=True表示在CMD环境下执行命令 result = subprocess.run( ['copy', source, target], shell=True, capture_output=True, text=True ) if result.returncode == 0: print("success") else: # 打印错误信息,快速定位问题 print(f"复制失败:{result.stderr}") else: print("fail")
内容的提问来源于stack exchange,提问作者Yawen
相关产品推荐
相关产品推荐

