2009-11-03 4 views
22

이 질문이 쉬운 것 같습니다. Google-fu는 분명히 실패합니다.Python을 사용하여 파일 시스템을 마운트하려면 어떻게해야합니까?

쉘 명령어 mount ...을 실행하는 것과 동일한 방법으로 파이썬을 사용하여 파일 시스템을 마운트하려면 어떻게해야합니까?

분명히 나는 ​​os.system을 사용하여 쉘 명령을 실행할 수 있지만 확실하게 깔끔한 Python 인터페이스가 마운트 시스템 호출입니다.

찾을 수 없습니다. 나는 그것이 단지 멋지고, 쉬울 것이라고 생각했다. os.mount().

+0

오래된 질문이지만 미래의 모험을위한 질문입니다. [mount.py] (https://github.com/MrVallentin/mount.py)를 보시오 – Vallentin

답변

3

확실히 이것은 마운트 시스템 호출에 대한 멋진 정리 된 파이썬 인터페이스입니다.

나는 그것을 찾을 수 없다. (나는 그것이 좋은, 쉬운 os.mount()라고 생각했다).

분명히 없습니다. 이 기능은 Windows에서 어떤 기능을합니까?

대신 셸 명령을 사용하십시오.

+11

'subprocess.Popen ("mount ...")를 통해 쉘 명령을 사용하십시오. –

+1

또한 umount/Windows에 파티션 마운트 – Jamol

+10

@Ferdinand'이 함수는 Windows에서 무엇을 할 것입니까? '사실, Python에는 플랫폼 관련 모듈 (_winreg, msilib, msvcrt, posix, maxostools 등)이 상당수 있으며 일반적인 함수 일부가 작동합니다 'subprocess.Popen (..., shell = False)'와 같은 플랫폼에서는 다르게 사용됩니다. 따라서이 옵션을 제외하는 기준은 아닙니다. – RedGlyph

3

설치가 매우 드문 작업이므로 직접하는 파이썬 방법이 있는지 의심 스럽습니다.

하나 (- subprocess를 사용하는 것이 훨씬 더 os.system()를 사용하지 않는) mount 명령을 호출 할 subprocess를 사용, 다른 (그리고 아마도 더 나은) 파이썬에서 직접 작업을 할 ctypes를 사용하거나.

+0

ctypes 문서에 대한 링크 때문에 Upvoted. – Wtower

0

심하게, 설치 및 것은 마운트 해제가 높은 시스템 의존하고 시스템 안정성

에 영향을 미칠 수

    거의 사용되지
  • 을하기 때문에 인 해결책이 없다 것들에 속한다 휴대용 가능. 그 이후, 필자는 Ferdinand Beyer와 동의합니다. 일반적인 파이썬 솔루션이 존재할 것 같지 않습니다.

7

cdllctypes에서 가져옵니다. 마운트는 libc의 마운트 호출 기능은 루트 권한이 필요 것

2

참고 매개 변수에 대한 그런 다음 운영 체제 libc를로드 한 후 libc.mount()

읽기 libc의 문서를 사용; Popen ([ 'mount'...)은 특정 마운트가 fstab에서 축복을받지 못하는 경우에만 해당됩니다 (이 실행을 수행하는 마운트 실행 파일 인 setuid root 임).

2

다른 사람들이 언급했듯이 루트로 실행하지 않는 한 syscall에 대한 직접 액세스는 도움이되지 않습니다 (여러 가지 이유로 일반적으로 좋지 않습니다). 따라서 "mount"프로그램을 호출하고 /etc/fstab이 사용자를위한 마운트를 가능하게했는지 확인하는 것이 가장 좋습니다.

마운트 호출하는 최선의 방법은 다음과 같습니다

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

what 장치 경로 또는 경로 마운트 포인트 중입니다. 문제가 발생하면 예외가 발생합니다.

또 다른 옵션은 상당히 새로운 sh 모듈을 사용하는 것입니다

+0

아니요 프로세스를 호출하는 것이 낫지 않습니다. 그것은 훨씬 더 오류가 발생하기 쉽습니다. – LtWorf

+1

@LtWorf 어떻게 그렇게? 프로세스를 호출 할 때 어떤 오류가 더 많이 발생합니까? kernal-non-expert로서, 대부분의 사용자와 마찬가지로, 나는 실패 할 가능성이 있고 그렇지 않은 것을 예측하기 어렵습니다. – Stefan

+0

시스템 호출을 수행하는 데 커널 전문가 일 필요는 없습니다. 그리고 도구는 매개 변수를 변경하는 경우가 있지만 시스템 호출은 항상 동일하게 유지됩니다. – LtWorf

6

(check_call는 쉽게 Popen 이상의 인터페이스와 낮은 수준의 형제입니다). 그것의 documentation에 따르면 그것은 파이썬 내에서 셸 명령과 유창한 통합을 제공합니다.

나는 지금 그것을 시험하고있다. 그것은 매우 유망 해 보인다.

from sh import mount 

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

또한 새로운 기능에 빠르게 멀리 추상적 인 명령 할 수 baking 한 번 봐 걸릴.

+2

당신이 그것을 downvote 경우이 답변은 질문에 대답하지 마세요. 고맙습니다. – samvv

+0

이 인수는 ctypes 응답보다 유용하다는 것을 알았습니다.이 인수는 인수가 잘못되었을 때 확실한 오류를 제공합니다. 필자의 경우 필요한 인수는'sh.mount ('/ dev/xvdf1', target_dir, "-text4")'입니다. 마지막 인수에는 공백이 없습니다. – nicb

+0

사용자는 쉘에서 mount 명령을 호출하는 대안을 설명하는 대답을 표시했습니다. 이 대답은 여전히 ​​쉘에서 mount 명령을 호출하는 것을 포함하므로 실제 대안을 제공하지 않습니다. –

21

다른 사람들도 지적했듯이, 내장 된 마운트 기능은 없습니다. 그러나,하는 ctypes를 사용하여 하나를 쉽게 만들 수 있으며,이 조금 가벼운 무게와 쉘 명령을 사용하는 것보다 더 신뢰할 수있다 :이 오래 알고

import ctypes 
import os 

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

mount('/dev/sdb1', '/mnt', 'ext4', 'rw') 
0

그러나 나는 비슷한 문제를 가지고 있었고, pexpect 그것을 해결했다. 마운트 명령을 사용하여 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

8

당신은 util-linux 프로젝트에서 libmount 파이썬 바인딩을 사용할 수 있습니다

import pylibmount as mnt 

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

자세한 내용은이 example를 참조하십시오.

+0

하지만 어디서 pylibmount를 가져올 수 있습니까? – Wtower

+1

@Wtower 사용중인 Linux 배포판에 따라 다릅니다. Fedora를 사용한다면 [python3-libmount] (https://apps.fedoraproject.org/packages/python3-libmount/) 패키지입니다. AFAIK 데비안은 libmount 용 파이썬 바인딩을 패키지하지 않으므로 직접 컴파일/설치해야합니다. – yegorich

관련 문제