使用gio在Python中访问Samba共享

5 投票
1 回答
3161 浏览
提问于 2025-04-15 17:33

我正在尝试用Python的gio库制作一个简单的命令行客户端,以便访问共享文件(是的,主要要求就是使用gio)。

我发现与它的前身gnome-vfs相比,gio提供了一些认证的功能(通过继承MountOperation),甚至还有一些特定于samba共享的方法,比如set_domain()

但是我在这段代码上遇到了问题:

import gio

fh = gio.File("smb://server_name/")

如果那个服务器需要认证,我想应该调用fh.mount_enclosing_volume(),因为这个方法需要一个MountOperation作为参数。问题是,调用这个方法没有任何反应,接下来逻辑上应该调用的fh.enumerate_children()(用来列出可用的共享)也失败了。

有没有人能提供一个使用gio的有效示例呢?

1 个回答

6

下面的代码是挂载一个存储卷所需的最基本代码:

def mount(f):
    op = gio.MountOperation()
    op.connect('ask-password', ask_password_cb)
    f.mount_enclosing_volume(op, mount_done_cb)

def ask_password_cb(op, message, default_user, default_domain, flags):
    op.set_username(USERNAME)
    op.set_domain(DOMAIN)
    op.set_password(PASSWORD)
    op.reply(gio.MOUNT_OPERATION_HANDLED)

def mount_done_cb(obj, res):
    obj.mount_enclosing_volume_finish(res)

(这个代码是从gvfs-mount中提取的。)

另外,你可能还需要一个运行中的glib.MainLoop,因为GIO的挂载功能是异步的。想了解更多细节,可以查看gvfs-mount的源代码。

撰写回答