首页 > 解决方案 > 我连接和显示 ftp 服务器内容的代码不会 cwd 超出 /[dir]/

问题描述

我似乎无法在archive.ubuntu.com 上更改/ubuntu/ 之后的目录,并且我怀疑我的代码更改到了错误的目录。我的错误在哪里?

from ftplib import FTP
from tkinter import *

ftp = FTP("archive.ubuntu.com")
ftp.login()

window = Tk()
window.geometry("640x480")


def listdir():
    print(ftp.dir())
    [child.destroy() for child in window.winfo_children()]
    for x in ftp.nlst():
        Button(window, text=x, command=(lambda: cdir(x))).pack()


def cdir(x):
    f = ftp.pwd()+"/"+x
    ftp.cwd(f)
    listdir()


listdir()

window.mainloop()

这是在我的大型应用程序中重现我的问题的简单代码。

系统:windows
python 运行时:python 3.8
如何防止这个错误?我可以使用 python 命令行很好地更改目录。ftplib 没有抛出任何错误,我尝试打印在 ftp 上运行的每个命令。

标签: pythonpython-3.xftpftplib

解决方案


您将希望在您的lambda函数中进行早期绑定。从改变

lambda: cdir(x)

到:

lambda y=x: cdir(y)

否则,您将获得x调用函数时的值,而不是创建函数时的值。


(显然你仍然需要告诉你的代码文件和目录之间的区别,因为有了上面的修复,你就可以导航到代表实际文件的按钮,当它尝试更改目录时单击这些按钮会出错给他们。但以上将解决您现在遇到的问题。)


推荐阅读