如何使用Python挂载文件系统?

jjh*_*jjh 32 python unix

我确信这是一个简单的问题,我的Google-fu显然让我失望了.

如何使用Python挂载文件系统,相当于运行shell命令mount ...

显然我可以os.system用来运行shell命令,但是肯定有一个很好的整洁的Python接口来挂载系统调用.

我找不到它.我认为这将是一个很好的,简单的os.mount().

Pau*_*hue 39

正如其他人所指出的那样,没有内置的挂载功能.但是,使用ctypes很容易创建一个,这比使用shell命令更轻,更可靠:

import ctypes
import ctypes.util
import os

libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
libc.mount.argtypes = (ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_char_p)

def mount(source, target, fs, options=''):
  ret = libc.mount(source, target, fs, 0, options)
  if ret < 0:
    errno = ctypes.get_errno()
    raise OSError(errno, "Error mounting {} ({}) on {} with options '{}': {}".
     format(source, fs, target, options, os.strerror(errno)))

mount('/dev/sdb1', '/mnt', 'ext4', 'rw')
Run Code Online (Sandbox Code Playgroud)

  • 无需在每次调用此函数时实例化 `CDLL` 并增加 libc 共享库上的引用计数。此外,定义函数原型是一种很好的做法,因此 ctypes 可以对参数进行类型检查。例如,在模块级别,`import ctypes, ctypes.util` 和 `libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)` 和 `libc.mount.argtypes = (ctypes. c_char_p、ctypes.c_char_p、ctypes.c_char_p、ctypes.c_ulong、ctypes.c_char_p)`。此外,使用自定义错误消息引发 `OSError(errno, errmsg)` 将比 `RuntimeError` 更惯用。 (4认同)

sam*_*mvv 13

另一种选择是使用相当新的sh模块.根据其文档,它提供了与Python内部的Shell命令的流畅集成.

我现在正在尝试它,它看起来很有希望.

from sh import mount

mount("/dev/", "/mnt/test", "-t ext4")
Run Code Online (Sandbox Code Playgroud)

另外,请看一下烘焙,它允许您快速抽象出新功能中的命令.

  • 请告知为什么如果你对它进行投票,这个答案不能回答这个问题.谢谢. (3认同)
  • OP 不想运行 `os.system`。OP 没有声明他不想运行“mount”命令。OP 想要“漂亮整洁”的界面,因此 `sh.mount()` 确实符合条件。 (2认同)

yeg*_*ich 10

您可以libmountutil-linux项目使用Python绑定:

import pylibmount as mnt

cxt = mnt.Context()
cxt.source = '/dev/sda1'
cxt.target = '/mnt/'
cxt.mount()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此示例.

  • 但是从哪里导入 pylibmount 呢? (2认同)
  • @Wtower 这取决于您使用的 Linux 发行版。如果您使用的是 Fedora,那么它是 [python3-libmount](https://apps.fedoraproject.org/packages/python3-libmount/) 包。AFAIK Debian 没有为 libmount 打包 Python 绑定,因此您必须自己编译/安装它。 (2认同)

mar*_*nov 9

cdll从中导入ctypes.然后加载你的操作系统libc,然后使用libc.mount()

阅读libc有关安装参数的文档


gst*_*ein 5

正如其他人所说,直接访问系统调用不会对您有帮助,除非您以 root 身份运行(由于多种原因,这通常是不好的)。因此,最好调用“挂载”程序,并希望已/etc/fstab为用户启用挂载。

调用挂载的最佳方法如下:

subprocess.check_call(["mount", what])
Run Code Online (Sandbox Code Playgroud)

其中what是设备路径或安装点路径。如果出现任何问题,则会引发异常。

(是一个比它的低级兄弟check_call更简单的界面)Popen

  • @LtWorf 怎么会这样?调用进程时更容易出现哪些错误?作为一个非内核专家,像大多数用户一样,我发现很难预测什么可能会失败,什么不会。 (2认同)
  • 使用系统调用需要 root 权限。(IMO)永远不鼓励以 root 身份运行 Python 程序。通过使用 setuid /bin/mount 程序,您的 Python 程序可以在非 root 权限下运行。另请注意,挂载程序非常轻量......它不像我们生成 JVM 子进程。 (2认同)

Fer*_*yer -16

当然,这是一个漂亮整洁的 mount 系统调用的 python 接口。

我找不到它(我认为这只是一个很好、简单的 os.mount())。

当然,没有。这个函数在 Windows 上会做什么?

请改用 shell 命令。

  • @Ferdinand`这个函数在 Windows 上会做什么?`实际上,Python 有很多特定于平台的模块(_winreg、msilib、msvcrt、posix、maxostools,...),而且一些常见函数在某些平台上的行为也有所不同,例如`例如 subprocess.Popen(..., shell=False)`。因此,这并不是排除该选项的标准。 (24认同)
  • *这个函数在 Windows 上会做什么?* 我不同意这个推理。例如 `os.symlink()`、`os.mkfifo()` 和 `oc.chmod()` 以及 `os` 中的许多其他仅用于 UNIX 的函数在 Windows 上有什么作用? (21认同)
  • 也可以在 Windows 上卸载/安装分区 (6认同)
  • 实际上,NTFS_确实_支持挂载点:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365733%28v=vs.85%29.aspx (4认同)
  • python 有 `os.fork()` 不适用于 Windows。 (2认同)