Windows 10下通过Python调用Robocopy无法复制__init__.py的求助
解决Robocopy无法复制带双下划线文件名(如__init__.py)的问题
结合你的Windows 10 + Python 3环境,以及遇到的__init__.py无法复制但普通文件名正常的问题,我整理了几个针对性的排查方向和解决方案:
1. 先手动验证Robocopy命令有效性
先排除Python代码的干扰,直接在管理员CMD里运行对应命令,同时开启详细日志:
robocopy . "C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\addons\out" __init__.py /v
通过/v参数的输出,你可以快速判断:
- 如果手动运行也失败,问题出在Robocopy的规则或系统层面;
- 如果手动能成功复制,再聚焦排查Python的subprocess调用逻辑。
2. 强制复制相同文件(解决Robocopy跳过"未更新"文件的情况)
Robocopy默认只会复制比目标文件新的文件,有时候即使你修改了源文件,可能因为时间戳同步异常,Robocopy误判文件无需更新,从而跳过复制。此时可以添加/IS参数强制复制:
修改你的Python代码中的命令列表:
command = [r"robocopy", source_path, destination_path, files[elem_index], "/IS"]
/IS参数会忽略文件的时间戳和大小差异,强制将源文件覆盖到目标路径。
3. 检查Robocopy返回码,定位具体问题
Robocopy的退出码规则和普通程序不同:0表示无文件需要复制,1-7均为成功状态(比如1代表复制成功),4及以上才是错误。你可以在代码中打印返回码辅助排查:
return_code = subprocess.call(command) print(f"Robocopy返回码: {return_code}") - 返回码0:Robocopy认为源文件与目标文件完全一致 → 用`/IS`强制复制即可; - 返回码4:文件无法复制(可能权限不足、文件被占用或源文件不存在) → 检查源文件路径是否正确、目标目录写入权限,或文件是否被其他程序锁定; - 返回码1/2/3:文件已成功复制 → 请确认目标路径下的文件是否已更新。
4. 确认源文件路径正确性
你的source_path设为.(当前目录),请确保运行Python脚本的当前工作目录确实是__init__.py所在的目录。可以添加以下代码验证:
import os print(f"当前工作目录: {os.getcwd()}") print(f"源文件是否存在: {os.path.exists(os.path.join(source_path, files[elem_index]))}")
如果输出"源文件是否存在: False",说明脚本运行目录不对,需要将source_path改为__init__.py的实际绝对路径。
5. 改用subprocess.run捕获详细执行日志
subprocess.run比call能返回更详细的执行信息,方便定位隐藏问题:
result = subprocess.run(command, capture_output=True, text=True) print(f"Robocopy标准输出:\n{result.stdout}") print(f"Robocopy错误输出:\n{result.stderr}")
通过捕获的日志,你可以直接看到Robocopy的执行细节,快速找到问题根源。
内容的提问来源于stack exchange,提问作者Ermakx
相关产品推荐
相关产品推荐

