Tôi muốn thử một cái gì đó như:
#!/usr/bin/python
from __future__ import print_function
import shlex
from subprocess import Popen, PIPE
def shlep(cmd):
'''shlex split and popen
'''
parsed_cmd = shlex.split(cmd)
## if parsed_cmd[0] not in approved_commands:
## raise ValueError, "Bad User! No output for you!"
proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
return (proc.returncode, out, err)
... Nói cách khác chúng ta hãy shlex.split() làm hầu hết công việc. Tôi sẽ không cố gắng phân tích cú pháp dòng lệnh của trình bao, tìm các toán tử đường ống và thiết lập đường dẫn của riêng bạn. Nếu bạn định làm điều đó thì về cơ bản bạn sẽ phải viết một trình phân tích cú pháp cú pháp trình bao (shell parser) hoàn chỉnh và cuối cùng bạn sẽ làm rất nhiều hệ thống ống nước.
Tất nhiên điều này đặt ra câu hỏi, tại sao không chỉ sử dụng Popen với tùy chọn shell = True (từ khóa)? Điều này sẽ cho phép bạn vượt qua một chuỗi (không tách và phân tích cú pháp) cho trình bao và vẫn thu thập kết quả để xử lý như bạn muốn. Ví dụ của tôi ở đây sẽ không xử lý bất kỳ đường ống, backticks, chuyển hướng mô tả tập tin, vv có thể có trong lệnh, tất cả chúng sẽ xuất hiện dưới dạng đối số theo nghĩa đen cho lệnh. Do đó, nó vẫn an toàn hơn khi chạy với shell = True ...Tôi đã đưa ra một ví dụ ngớ ngẩn về việc kiểm tra lệnh chống lại một số từ điển "lệnh được chấp thuận" hoặc đặt --- thông qua nó sẽ có ý nghĩa hơn để bình thường hóa nó thành một đường dẫn tuyệt đối trừ khi bạn có ý định yêu cầu các đối số được chuẩn hóa trước chuyển chuỗi lệnh đến hàm này.
Nguồn
2013-04-10 05:27:34
* subprocess.call() * có thể được sử dụng để đọc/lỗi. [vui lòng kiểm tra hướng dẫn] (http://docs.python.org/2/library/subprocess.html). đảm bảo lệnh không tạo ra nhiều đầu ra. – tuxuday