python - 我连接和显示 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 上运行的每个命令。
解决方案
您将希望在您的lambda
函数中进行早期绑定。从改变
lambda: cdir(x)
到:
lambda y=x: cdir(y)
否则,您将获得x
调用函数时的值,而不是创建函数时的值。
(显然你仍然需要告诉你的代码文件和目录之间的区别,因为有了上面的修复,你就可以导航到代表实际文件的按钮,当它尝试更改目录时单击这些按钮会出错给他们。但以上将解决您现在遇到的问题。)
推荐阅读
- c++ - 在 Linux 中链接时库冲突,但不是 OSX
- delphi - 如何在delphi中获得拉伸TImage的新尺寸
- php - 如何使用 html5、css3 和 php 创建交互式搜索栏,结果构建并返回一个新的组合页面?
- angular - DOMException 在 Angular 2+ 中使用 jsPDF 生成 pdf
- angular - Angular 6中的ngClass函数阻止了插值?
- ios - XCUITest 与 TestRail 的集成
- jquery - 日期选择器的查询版本
- node.js - 节点 8 突然 EADDRINUSE 错误
- mysql - 关于 MySQL 存储过程
- javascript - 模拟器卡在从 10.0.2.2:8081 加载,有什么问题?