我的用于连接和显示ftp服务器内容的代码未在/ [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上运行的每个命令。

解决方法

您需要在lambda函数中尽早绑定。更改为

lambda: cdir(x)

收件人:

lambda y=x: cdir(y)

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


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