You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python ftplib中pwd()返回空字符串但voidcmd("PWD")正常的异常问题求助

问题排查:ftplib.pwd()返回空但voidcmd("PWD")正常的原因与解决办法

核心原因分析

这个问题大概率出在ftplib内置的pwd()方法对FTP服务器响应的解析逻辑上。我们可以先看看ftplib源码里pwd()的实现逻辑:

def pwd(self):
    resp = self.voidcmd('PWD')
    # 这里的正则用来匹配服务器返回的PWD响应格式
    m = _PWD_RESP.match(resp)
    if m:
        return m.group(1)
    raise error_perm(resp)

其中_PWD_RESP的默认正则通常是类似r'^257\s+"([^"]+)"'的格式——它预期服务器返回的响应是双引号包裹路径的格式(比如257 "/DirName")。但有些小众或自定义的FTP服务器可能返回不带引号的路径(比如257 /DirName),或者响应格式包含正则未覆盖的特殊字符/结构,导致匹配失败。你这里没抛出异常却返回空,可能是服务器返回的响应中,正则匹配到了空的分组(比如特殊的引号转义场景)。

而voidcmd("PWD")是直接返回服务器的原始响应字符串,没有经过解析,所以能正常拿到完整内容。

解决办法

根据你的场景,有几个可行的方案:

方案1:手动解析voidcmd("PWD")的返回结果

既然voidcmd("PWD")能拿到正确的原始响应,我们可以自己提取路径。比如针对常见的两种响应格式(带引号/不带引号),可以用简单的字符串处理实现:

# 替代原来的ftp.pwd()调用
resp = ftp.voidcmd("PWD")
# 先去掉开头的"257 "标识,再移除可能存在的双引号
path = resp.split(" ", 1)[1].strip('"')
print(path)

如果服务器的响应格式比较特殊,你可以根据实际返回的resp内容调整字符串处理逻辑。

方案2:重写ftplib的pwd()方法适配目标服务器

如果不想每次都手动解析,可以修改ftplib的正则匹配规则,或者给FTP实例添加一个自定义的pwd方法:

from ftplib import FTP
import re

# 自定义正则,同时支持带引号和不带引号的路径格式
custom_pwd_regex = re.compile(r'^257\s+(?:"([^"]+)"|([^\s]+))$')

ftp = FTP(host)
ftp.login(username, password)
ftp.cwd("/DirName")

# 定义自定义的pwd方法
def custom_pwd(self):
    resp = self.voidcmd('PWD')
    m = custom_pwd_regex.match(resp)
    if m:
        # 返回匹配到的第一个非空分组
        return m.group(1) or m.group(2)
    raise self.error_perm(resp)

# 将自定义方法绑定到ftp实例
ftp.pwd = custom_pwd.__get__(ftp, FTP)

# 现在调用ftp.pwd()就能正常获取路径了
res = ftp.pwd()
print(res)

方案3:直接用voidcmd("PWD")替代

如果只是个别设备存在这个问题,最简单的方式就是直接在代码里用voidcmd("PWD"),然后根据返回的原始内容提取路径,省去修改全局逻辑的麻烦。

内容的提问来源于stack exchange,提问作者Ben Pinhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:59:09