trả lời cho phần thứ hai của câu hỏi
(xin lỗi hộp bình luận là quá nhỏ)
Paul Hoffman, bạn đang đúng, tôi chỉ đề cập đến một phần của câu hỏi của bạn đối phó với intrinsics, nhưng nó sẽ không phải là một ngôn ngữ kịch bản xứng đáng nếu nó không thể xử lý apt-get
. Thư viện ưa thích là một chút dài dòng nhưng nó không được công việc:
>>> apt_get = ['/usr/bin/apt-get', 'install', 'python']
>>> p = subprocess.Popen(apt_get, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> p.wait()
100 # Houston, we have a problem.
>>> p.stderr.read()
'E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)'
'E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?\n'
Nhưng Popen
là một công cụ tổng quát và có thể được bao bọc cho tiện theo dõi:
$ cat apt.py
import errno
import subprocess
def get_install(package):
cmd = '/usr/bin/apt-get install'.split()
cmd.append(package)
output_kw = {'stdout': subprocess.PIPE, 'stderr': subprocess.PIPE}
p = subprocess.Popen(cmd, **output_kw)
status = p.wait()
error = p.stderr.read().lower()
if status and 'permission denied' in error:
raise OSError(errno.EACCES, 'Permission denied running apt-get')
# other conditions here as you require
$ python
>>> import apt
>>> apt.get_install('python')
Traceback ...
OSError: [Errno 13] Permission denied running apt-get
Và bây giờ chúng tôi đang trở lại để xử lý ngoại lệ. Tôi sẽ từ chối bình luận về tính tổng quát quá mức của Java của mô-đun subprocess.
Đây là cách di động nhất và thậm chí hoạt động trong một hoàn cảnh kỳ lạ hơn một chút, giống như với quyền hạn giới hạn của SELinux. –
Điều này thực sự có thể tồi tệ hơn tùy thuộc vào tình hình. Hmm nhưng Florian có một điểm. –
@Longpoke - là bạn đang đề cập đến tình huống mà người dùng có thể đổi tên quyền trong/etc nhưng - giả sử thiếu khả năng xóa tệp khỏi đường dẫn đó? Nếu đó là những gì bạn có nghĩa là, sau đó cố gắng để xác định những gì khả năng người dùng có trước là errand của một kẻ ngốc. Tốt hơn là cấu trúc mã của bạn cho ngữ nghĩa "giao dịch" trong đó A và B có thể được cuộn lại nếu C không thành công. – msw