2009-11-07 10 views
6

Tôi đang làm việc trên một kịch bản lệnh Python GUI đơn giản để thực hiện một số tác vụ đơn giản trên một hệ thống. Một số công việc đó liên quan đến apt-get install để cài đặt một số gói.Đầu ra phân tích cú pháp cài đặt apt-get cho thanh tiến trình

Trong khi điều này đang diễn ra, tôi muốn hiển thị thanh tiến trình cần cập nhật với tiến trình tải xuống, sử dụng phần trăm nhỏ được hiển thị trong giao diện apt-get trong thiết bị đầu cuối.

NHƯNG! Tôi không thể tìm cách để có được thông tin tiến độ. Đường ống hoặc chuyển hướng đầu ra của apt-get chỉ cung cấp các dòng tĩnh hiển thị thông báo "đã tải xuống hoàn tất" cho mỗi gói và giống nhau để đọc qua subprocess.Popen() trong tập lệnh của tôi.

Làm cách nào để đọc từ đầu ra của apt-get để nhận được tỷ lệ phần trăm của tệp được tải xuống?

Trả lời

3

Như tôi thường nói, sử dụng pexpect, không tiến trình con, vv, để chạy các tiến trình con khi bạn cần để có được kết quả liên tục. pexpect fools các subprocess vào tin rằng nó đang chạy trên một terminal, vì vậy subprocess sẽ cung cấp chỉ là loại đầu ra nó sẽ cung cấp trên một thiết bị đầu cuối thực ... và bạn có thể bắt nó và biến nó thành bất kỳ loại đầu ra ưa thích mà bạn muốn!)

+0

Bất kỳ cơ hội nào có thể hoạt động trong cổng C của tôi cũng như sử dụng posix popen()? Hoặc là có một phương pháp tương tự? –

+2

'popen' sẽ cho phép tiến trình con biết đầu ra của nó là một đường ống, vì vậy bạn có thể không may mắn ngoại trừ các lệnh đủ tốt để cho phép bạn yêu cầu" hoàn toàn không tạo ra được thời gian thực bất cứ lúc nào! " và tôi không nghĩ apt-get nằm trong nhóm ưu tú đó. Để triển khai "thiết bị đầu cuối giả" trong C dưới Linux, hãy bắt đầu với trang người dùng pty (7), ví dụ: tại http://linux.die.net/man/7/pty - và, chúc may mắn (rất nhiều công việc sẽ là cần thiết!). –

5

Thay vì phân tích cú pháp đầu ra của apt-get, bạn có thể sử dụng gói python-apt để cài đặt. AFAIK nó cũng có các mô-đun để báo cáo tiến độ.

+0

Hãy nhìn vào /usr/share/doc/python-apt/examples/progress.py – unutbu

+0

Bất kỳ cách nào để thực hiện điều này mà không cần Python và không có mớ hỗn độn của libapt? –