我想在我的应用程序中实现一个功能,用于上传和操作 WebDAV 服务器上的文件。我正在寻找一个成熟的 Python 库,它可以提供类似于os.*
用于处理远程文件的模块的界面。谷歌搜索已经发现了一些 Python 中的 WebDAV 选项,但我想知道这些天哪些更广泛使用。
7 回答
遗憾的是,对于这个肯定不止一个人感兴趣的问题(“使用什么 Python webdav 库?”),接受了不相关的答案(“不要使用 Python webdav 库”)。好吧,Stackexchange 上的常见问题。
对于将要寻找真正答案的人,并考虑到原始问题中的要求(类似于“os”模块的简单 API),我可能会建议easywebdav,它具有非常简单的 API,甚至是漂亮而简单的实现,提供上传/下载和很少的文件/目录管理方法。由于实现简单,目前还不支持目录列表,但是已经提交了bug,作者打算添加。
我刚刚有类似的需求,最终测试了一些 Python WebDAV 客户端以满足我的需求(从 WebDAV 服务器上传和下载文件)。以下是我的经验总结:
1)对我有用的是python-webdav-lib。
文档不多,但快速浏览一下代码(特别是示例)就足以弄清楚如何让它为我工作。
2) PyDAV 0.21(我发现的最新版本)不适用于 Python 2.6,因为它使用字符串作为异常。我没有尝试解决这个问题,期待以后会有更多的不兼容。
3) davclient 0.2.0。我查看了它,但没有进一步探索,因为文档没有提到我正在寻找的 API 级别(文件上传和下载)。
4) Python_WebDAV_Library-0.3.0。好像没有上传功能。
显然您正在寻找 WebDAV 客户端库。
不确定如何产生大量点击,似乎以下 2 个看起来相关:
- PyDAV: http ://users.sfo.com/~jdavis/Software/PyDAV/readme.html#client
- Zope - 并寻找 client.py
import easywebdav
webdav = easywebdav.connect(
host='dav.dumptruck.goldenfrog.com',
username='_snip_',
port=443,
protocol="https",
password='_snip_')
_file = "test.py"
print webdav.cd("/dav/")
# print webdav._get_url("")
# print webdav.ls()
# print webdav.exists("/dav/test.py")
# print webdav.exists("ECS.zip")
# print webdav.download(_file, "./"+_file)
print webdav.upload("./test.py", "test.py")
我对这些库中的任何一个都没有经验,但是 Python 包索引(“PyPi”)列出了很多 webdav 模块。
安装:
$ sudo apt-get install libxml2-dev libxslt-dev python-dev
$ sudo apt-get install libcurl4-openssl-dev python-pycurl
$ sudo easy_install webdavclient
例子:
import webdav.client as wc
options = {
'webdav_hostname': "https://webdav.server.ru",
'webdav_login': "login",
'webdav_password': "password"
}
client = wc.Client(options)
client.check("dir1/file1")
client.info("dir1/file1")
files = client.list()
free_size = client.free()
client.mkdir("dir1/dir2")
client.clean("dir1/dir2")
client.copy(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
client.move(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
client.download_sync(remote_path="dir1/file1", local_path="~/Downloads/file1")
client.upload_sync(remote_path="dir1/file1", local_path="~/Documents/file1")
client.download_async(remote_path="dir1/file1", local_path="~/Downloads/file1", callback=callback)
client.upload_async(remote_path="dir1/file1", local_path="~/Documents/file1", callback=callback)
link = client.publish("dir1/file1")
client.unpublish("dir1/file1")
链接:
我不知道具体的,但根据您的平台,通过文件系统挂载和访问 WebDAV 提供的文件可能更简单。有davfs2和一些操作系统,比如 Mac OS X,内置了 WebDAV 文件系统支持。