Python 3.6调用curl从FTPS删除远程文件报错求助
解决Python调用curl删除FTPS远程文件的报错问题
我看了你的代码,发现几个可能导致curl报错的关键点,咱们一步步来修正和排查:
1. 移除-Q参数的多余引号
这是最可能的问题根源:你在-Q的参数里加了额外的双引号'"DELE ..."',但subprocess.Popen用列表传参时,每个参数会被直接传递给curl,不需要额外加引号——这些引号会被curl当成DELE命令的一部分,导致FTP服务器无法识别合法的删除指令。
把原来的:
"-Q", '"DELE '+remote_path+'/'+file+'"'
改成(推荐用Python3.6支持的f-string更清晰):
"-Q", f"DELE {remote_path}/{file}"
如果不习惯f-string,也可以用字符串拼接:
"-Q", "DELE " + remote_path + "/" + file
2. 精简冗余的curl参数
你的curl参数里有一些重复或不必要的设置,可以优化:
--ftp-ssl和--ftp-ssl-reqd:后者已经强制要求使用SSL连接,不需要同时保留--ftp-ssl,保留--ftp-ssl-reqd即可-k:这个参数会忽略SSL证书验证,如果你的FTPS服务器用的是合法可信的证书,可以去掉该参数;如果是自签名证书,保留它没问题
3. 修正后的完整代码
这里是调整后的代码,同时增加了错误输出的打印,方便你排查问题:
import subprocess # 假设ftp_user, ftp_pass, ftpconn, remote_path, file已提前定义 proc = subprocess.Popen( [ "curl", "-v", "-u", f"{ftp_user}:{ftp_pass}", "-k", # 仅当证书不可信时保留 "--ftp-ssl-reqd", "--tlsv1.2", "--ftp-pasv", ftpconn, "-Q", f"DELE {remote_path}/{file}" ], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) try: outs, errs = proc.communicate(timeout=120) # 打印curl的输出和错误信息,方便排查 print("Curl标准输出:", outs.decode("utf-8", errors="ignore")) print("Curl错误输出:", errs.decode("utf-8", errors="ignore")) except subprocess.TimeoutExpired: proc.kill() outs, errs = proc.communicate() print("连接超时!错误信息:", errs.decode("utf-8", errors="ignore"))
额外排查点
如果修正后还是报错,可以从这几个方向检查:
- 路径拼接问题:确保
remote_path和file拼接后是正确的远程路径,比如避免出现//这种重复斜杠,可以用os.path.join(remote_path, file)来自动处理路径分隔符(需要导入os模块) - 权限与文件存在性:确认你的FTP账号对目标文件有删除权限,且文件确实存在于指定路径下
- SSL握手问题:查看
-v参数输出的详细日志,确认是否是TLS版本不兼容、证书验证失败等SSL层面的问题
内容的提问来源于stack exchange,提问作者Barak K.
相关产品推荐
相关产品推荐

