Nếu ai đó thực sự muốn dữ liệu đó, tôi khuyên bạn nên đính kèm trình gỡ lỗi gdb vào trình thông dịch python, tạm thời dừng tác vụ, gọi fsync(1)
( stdout ), tách khỏi nó (tiếp tục quá trình) và kiểm tra lại tệp đầu ra.
Nhìn vào /proc/$(pidof python)/fd
để xem mô tả tập tin hợp lệ. $(pidof x)
trả về PID của quá trình có tên ' x
'.
# your python script is running merrily over there.... with some PID you've determined.
#
# load gdb
gdb
#
# attach to python interpreter (use the number returned by $(pidof python))
attach 1234
#
# force a sync within the program's world (1 = stdout, which is redirected in your example)
call fsync(1)
#
# the call SHOULD have returned 0x0, sync successful. If you get 0xffffffff (-1), perhaps that wasn't stdout. 0=stdin, 1=stdout, 2=stderr
#
# remove our claws from poor python
detach
#
# we're done!
quit
Tôi đã sử dụng phương pháp này để thay đổi thư mục làm việc, chỉnh sửa cài đặt ... nhiều thứ. Than ôi, bạn chỉ có thể gọi các chức năng được xác định trong chương trình đang chạy, fsync
mặc dù hoạt động độc đáo.
(lệnh gdb ' info functions
' sẽ liệt kê tất cả các chức năng có sẵn. Mặc dù vậy, hãy cẩn thận. Bạn đang hoạt động TRỰC TIẾP trên một quy trình.)
Ngoài ra còn có lệnh peekfd
(được tìm thấy trong psmisc
gói trên Debian Jessie và những người khác) sẽ cho phép bạn xem những gì ẩn trong bộ đệm của một tiến trình. Một lần nữa, /proc/$(pidof python)/fd
sẽ hiển thị cho bạn các mô tả tệp hợp lệ để đưa ra làm đối số cho peekfd.
Nếu bạn không nhớ -u
python, bạn luôn có thể đặt tiền tố một lệnh với stdbuf
(trong coreutils
, đã được cài đặt) để đặt stdin / stdout / stderr thành unbuffered, đệm dòng hoặc chặn bộ đệm như mong muốn:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Tất nhiên, man pages
là bạn của bạn, hey! có lẽ một bí danh cũng có thể hữu ích ở đây.
alias python='python -u'
Bây giờ python của bạn luôn sử dụng -u
cho tất cả các nỗ lực dòng lệnh của bạn!