Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python挂载文件系统?_Python_Unix - Fatal编程技术网

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

如何使用Python挂载文件系统?,python,unix,Python,Unix,我相信这是一个简单的问题,我的谷歌fu显然让我失望 如何使用Python装载文件系统,相当于运行shell命令mount… 显然,我可以使用os.system来运行shell命令,但是mount系统调用肯定有一个整洁的Python接口 我找不到它。我认为这将是一个很好的、简单的os.mount() 当然,这是一个很好的整洁的python挂载系统调用接口 我找不到它(我以为它只是一个很好的、简单的os.mount() 当然没有。这个函数在Windows上做什么 请改用shell命令。挂载是一种非常

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

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

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

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

当然,这是一个很好的整洁的python挂载系统调用接口

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

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


请改用shell命令。

挂载是一种非常罕见的操作,因此怀疑是否有任何直接的python方法可以做到这一点


使用直接从python执行操作,或者(可能更好)使用
子进程
调用mount命令(不要使用
os.system()
-最好使用
子进程
)。

糟糕的是,装载和卸载属于高度依赖系统的事情,因为它们是独立的

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

没有可移植的解决方案。因此,我同意Ferdinand Beyer的观点,即不太可能存在通用的Python解决方案。

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


阅读
libc
的挂载参数文档

注意,调用libc挂载函数需要root权限;Popen(['mount'…)只有在特定的挂载在fstab中不受欢迎时才会出现(执行这些检查的是挂载可执行文件setuid root)。

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

调用挂载的最佳方法是使用以下命令:

subprocess.check_call(["mount", what])
其中
what
是设备路径或装入点路径。如果出现任何问题,则会引发异常


check\u call
是一个比
Popen
及其低级同类更简单的接口)

另一个选择是使用全新的模块。根据其功能,它提供了与Python内部Shell命令的流畅集成

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

从sh导入挂载
挂载(“/dev/”、“/mnt/test”、“-text4”)

另请看一看,它允许您在新函数中快速抽象出命令。

正如其他人所指出的,没有内置的
mount
函数。但是,使用
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.encode(), target.encode(), fs.encode(), 0, options.encode())
  if ret < 0:
    errno = ctypes.get_errno()
    raise OSError(errno, f"Error mounting {source} ({fs}) on {target} with options '{options}': {os.strerror(errno)}")

mount('/dev/sdb1', '/mnt', 'ext4', 'rw')
导入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)
def装载(源、目标、fs、选项=“”):
ret=libc.mount(source.encode()、target.encode()、fs.encode()、0、options.encode())
如果ret<0:
errno=ctypes.get\u errno()
引发OSError(errno,f“在{target}上用选项{options}装载{source}({fs})时出错:{os.strerror(errno)}”)
挂载('/dev/sdb1','/mnt',ext4',rw')

我知道这是个老问题,但我遇到了类似的问题,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 )

来源:

您可以从项目中为
libmount
使用Python绑定:


有关更多信息,请参阅此项。

也可以在上装载/装载分区windows@Ferdinand
这个函数在Windows上做什么?
实际上,Python有很多特定于平台的模块(_winreg、msilib、msvcrt、posix、maxostools等),还有一些常见函数在某些平台上的行为不同,例如
subprocess.Popen(…,shell=False)
。因此,这不是排除该选项的标准。该函数在Windows上会做什么?我不同意这种推理。例如
os.symlink()
os.mkfifo()
oc.chmod())
和Windows上的
os
do中的许多其他仅用于unix的函数?实际上,NTFS确实支持装载点:python有
os.fork()
这在windows上不起作用。不,调用进程并不更好。它更容易出错。@LtWorf怎么会这样?调用进程更容易出错?作为内核非专家,与大多数用户一样,我发现很难预测什么可能会失败,什么不会失败。进行系统调用不需要内核专家。还有工具有时更改参数,而系统调用始终保持不变。使用系统调用需要root权限。以root身份运行Python程序(IMO)永远不要鼓励。通过使用setuid/bin/mount程序,您的Python程序可以使用非根priv运行。还要注意的是,mount程序非常轻量级…这不像是生成JVM子进程。此外,代码更清晰/可维护,并且不需要安装自定义Python模块。请注意如果你投反对票,为什么这个答案不能回答这个问题。谢谢。我发现这个答案比ctypes答案更有用,ctypes答案会在你的参数错误时给出难以理解的错误。在我的例子中,需要的参数是
sh.mount('/dev/xvdf1',target_dir,“-text4”)
。注意最后一个参数没有空格。用户表示ans
import pylibmount as mnt

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