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

时间:2009-11-03 13:10:08

标签: python unix

我确信这是一个简单的问题,我的谷歌显然让我失望。

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

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

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

10 个答案:

答案 0 :(得分:35)

正如其他人所指出的那样,没有内置的挂载功能。但是,使用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')

答案 1 :(得分:13)

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

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

from sh import mount

mount("/dev/", "/mnt/test", "-t ext4")

另请查看baking,它可以让您快速抽象出新功能中的命令。

答案 2 :(得分:10)

您可以在util-linux项目中使用libmount的Python绑定:

import pylibmount as mnt

cxt = mnt.Context()
cxt.source = '/dev/sda1'
cxt.target = '/mnt/'
cxt.mount()

有关详细信息,请参阅此example

答案 3 :(得分:8)

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

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

答案 4 :(得分:4)

挂载是一种非常罕见的操作,所以有任何直接的python方法都值得怀疑。

使用ctypes直接从python执行操作,否则(可能更好),使用subprocess调用mount命令(不要使用os.system() - 更好使用subprocess)。

答案 5 :(得分:3)

请注意,调用libc mount函数将需要root权限; Popen(['mount'...)只会在fstab中没有特定的安装(它是mount执行文件,setuid root,执行这些检查)。

答案 6 :(得分:2)

正如其他人所说,直接访问系统调用对您没有帮助,除非您以root身份运行(由于许多原因,这通常很糟糕)。因此,最好是呼叫#34; mount&#34;程序,并希望/etc/fstab已为用户启用了挂载。

调用 mount 的最佳方法如下:

subprocess.check_call(["mount", what])

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

check_callPopen及其低级弟兄更容易接口

答案 7 :(得分:0)

严重的是,安装和卸载属于高度依赖系统的东西,因为它们是

  • 很少使用和
  • 会影响系统稳定性

没有可移植的解决方案。从那以后,我同意Ferdinand Beyer的看法,即不太可能存在一般的Python解决方案。

答案 8 :(得分:0)

我知道这已经过时了,但我遇到了类似的问题并且pexpect解决了这个问题。我可以使用mount命令挂载我的Windows共享驱动器但是我无法通过密码,因为它必须被转义。我厌倦了逃避它并尝试使用凭证文件,这也导致了问题。这似乎对我有用。

password = "$wirleysaysneverquit!!!"

cmd = "sudo mount -t cifs -o username=myusername,domain=CORPORATE,rw,hard,nosetuids,noperm,sec=ntlm //mylong.evenlonger.shareddrivecompany.com/some/folder /mnt/folder -v"
p = pexpect.spawn( cmd )
p.expect( ": " )
print( p.before + p.after + password )
p.sendline( password )
p.expect( "\r\n" )

output = p.read()
arroutput = output.split("\r\n")
for o in arroutput:
    print( o )

来源:https://gist.github.com/nitrocode/192d5667ce9da67c8eac

答案 9 :(得分:-1)

  

肯定这是一个很好的整洁的python接口,用于挂载系统调用。

     

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

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

改为使用shell命令。