2010-02-09 33 views
8

tôi cần phải gắn kết một thư mục "dir" trên một máy mạng "dữ liệu" sử dụng python trên một máy linuxLàm thế nào để gắn kết một thư mục mạng bằng cách sử dụng python?

Tôi biết rằng tôi có thể gửi các lệnh thông qua dòng lệnh:

mkdir ~/mnt/data_dir 
mount -t data:/dir/ ~/mnt/data_dir 

nhưng làm thế nào sẽ Tôi gửi những lệnh này từ một kịch bản python?

+4

Trùng lặp: http://stackoverflow.com/questions/325463/launch-a-shell-command-with-in-a -python-script-wait-for-the-termination-and-retu –

+0

Câu hỏi không giống nhau nhưng câu trả lời là. –

+0

Câu hỏi cũ, nhưng đối với những cuộc phiêu lưu trong tương lai. Hãy xem [mount.py] (https://github.com/MrVallentin/mount.py). – Vallentin

Trả lời

1

Dưới đây là một cách:

import os 

os.cmd ("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir") 

Bạn cũng có thể sử dụng "popen" nếu bạn muốn đọc đầu ra của lệnh trong kịch bản của bạn.

HIH

... richie

+3

Một ví dụ tốt hơn sẽ sử dụng 'subprocess.Popen'. –

+4

Ví dụ tốt nhất sẽ sử dụng 'subprocess.check_call'. –

2

Ví dụ sử dụng các mô-đun subprocess:

import subprocess 

subprocess.Popen(["mkdir", "~/mnt/data_dir", "mount", "-t", "data:/dir/", "/mnt/data_dir"]) 

HOẶC

import subprocess 

subprocess.Popen("mkdir ~/mnt/data_dir mount -t data:/dir/ /mnt/data_dir", shell=True) 

Phiên bản thứ hai sử dụng vỏ để thực hiện lệnh. Mặc dù dễ đọc hơn và dễ sử dụng hơn trong hầu hết các trường hợp, nên tránh khi chuyển đối số do người dùng gửi vì những đối số này có thể dẫn đến chèn shell (nghĩa là thực thi các lệnh khác ngoài lệnh mkdir trong trường hợp này).

+1

Tôi không tin rằng ví dụ đầu tiên của bạn sẽ hoạt động. subprocess sẽ không mở rộng '~'. Khi 'shell = True' nó sẽ mở rộng, đó là lý do tại sao ví dụ thứ hai của bạn hoạt động. –

9

Tôi khuyên bạn nên sử dụng subprocess.checkcall.

from subprocess import * 

#most simply 
check_call('mkdir ~/mnt/data_dir', shell=True) 
check_call('mount -t whatever data:/dir/ ~/mnt/data_dir', shell=True) 


#more securely 
from os.path import expanduser 
check_call([ 'mkdir', expanduser('~/mnt/data_dir') ]) 
check_call([ 'mount', '-t', 'whatever', 'data:/dir/', expanduser('~/mnt/data_dir') ]) 
6

tôi đã cố gắng này trong chroot không proc gắn

/ # python 
Python 2.7.1 (r271:86832, Feb 26 2011, 00:09:03) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> from ctypes import * 
>>> libc = cdll.LoadLibrary("libc.so.0") 
>>> os.listdir("/proc") 
[] 
>>> libc.mount(None, "/proc", "proc", 0, None) 
0 
>>> os.listdir("/proc") 
['vmnet', 'asound', 'sysrq-trigger', 'partitions', 'diskstats', 'crypto', 'key-users', 'version_signature', 'kpageflags', 'kpagecount', 'kmsg', 'kcore', 'softirqs', 'version', 'uptime', 'stat', 'meminfo', 'loadavg', 'interrupts', 'devices', 'cpuinfo', 'cmdline', 'locks', 'filesystems', 'slabinfo', 'swaps', 'vmallocinfo', 'zoneinfo', 'vmstat', 'pagetypeinfo', 'buddyinfo', 'latency_stats', 'kallsyms', 'modules', 'dma', 'timer_stats', 'timer_list', 'iomem', 'ioports', 'execdomains', 'schedstat', 'sched_debug', 'mdstat', 'scsi', 'misc', 'acpi', 'fb', 'mtrr', 'irq', 'cgroups', 'sys', 'bus', 'tty', 'driver', 'fs', 'sysvipc', 'net', 'mounts', 'self', '1', '2', '3', '4', '5', '6', '7', '8' .......... 

Bạn sẽ có thể thay đổi các tập tin thiết bị từ "Không" với định dạng mount() chức năng hy vọng cho mạng chia sẻ. Tôi tin rằng nó giống với lệnh gắn kết "máy chủ lưu trữ:/path/to/dir"

+1

Bạn thật tuyệt vời. – synthesizerpatel

Các vấn đề liên quan