Saya memiliki skrip python yang sudah berjalan lama yang secara berkala menampilkan data ke keluaran standar yang saya gunakan dengan sesuatu seperti:
python script.py > output.txt
Script ini telah berjalan beberapa saat dan saya ingin menghentikannya dengan Ctrl+ Ctetapi tidak kehilangan outputnya. Sayangnya ketika saya mengimplementasikan skrip, saya lupa menyiram buffer setelah setiap baris output dengan sesuatu seperti sys.stdout.flush()
( solusi yang disarankan sebelumnya untuk memaksa pembilasan output), sehingga memohon Ctrl+ Csekarang akan menyebabkan saya kehilangan semua output saya.
Jika bertanya-tanya apakah ada cara untuk berinteraksi dengan skrip python yang berjalan (atau, lebih umum, proses yang berjalan) untuk memaksanya mem-flush buffer outputnya. Saya tidak bertanya bagaimana cara mengedit dan menjalankan kembali skrip untuk mem-flush dengan benar - pertanyaan ini khusus tentang berinteraksi dengan proses yang sedang berjalan (dan, dalam kasus saya, tidak kehilangan output dari eksekusi kode saya saat ini).
fileobject.c
) yang berbeda dari 2,7 . Seseorang perlu menggaliio
modul.Tidak ada solusi untuk masalah langsung Anda. Jika skrip Anda sudah dimulai, Anda tidak dapat mengubah mode buffering setelah fakta. Ini semua adalah buffer dalam memori dan semua itu diatur ketika skrip dimulai, pegangan file dibuka, pipa dibuat, dll.
Sebagai upaya jangka panjang, jika dan hanya jika beberapa atau semua buffering yang dimaksud dilakukan pada level IO pada output, Anda dapat melakukan
sync
perintah; tetapi ini umumnya tidak mungkin dalam kasus seperti ini.Di masa depan Anda dapat menggunakan
-u
opsi * Python untuk menjalankan skrip. Secara umum, banyak perintah memiliki opsi spesifik perintah untuk menonaktifkan buffer stdin / stdout, dan Anda mungkin juga memiliki beberapa kesuksesan generik denganunbuffer
perintah dariexpect
paket.A Ctrl+ Cakan menyebabkan buffer tingkat sistem memerah ketika program terganggu kecuali buffering dilakukan oleh Python sendiri dan belum menerapkan logika untuk menyiram buffernya sendiri dengan Ctrl+ C. Menangguhkan, menabrak, atau membunuh tidak akan baik.
* Memaksa stdin, stdout, dan stderr untuk sepenuhnya tidak terganggu.
sumber
Python 2.7.7 Dokumentasi, bagian "Pengaturan dan Penggunaan Python", ayat 1. Baris perintah dan lingkungan , menjelaskan argumen Python ini:
Dan juga variabel lingkungan ini:
sumber
sys.stdout.flush()
, tetapi-u
pilihan Anda tampaknya lebih mudah), tetapi baru saja lupa melakukannya ketika menjalankan kode saya. Setelah menjalankan kode saya selama lebih dari seminggu, saya berharap ada cara untuk mendapatkan hasil tanpa harus menjalankan kembali kode tersebut selama seminggu lagi.Tampaknya saya terlalu berhati-hati tentang kehilangan oleh buffered output setelah menjalankan Ctrl-C; menurut posting ini saya harus mengharapkan buffer akan memerah jika program saya memiliki keluar normal, yang akan terjadi jika saya menekan Ctrl-C. Di sisi lain, saya akan kehilangan output buffered jika saya membunuh skrip dengan SIGKILL atau serupa.
sumber
Saya pikir solusi lain yang mungkin bisa memaksa proses kill dengan core dumped dan kemudian menganalisis konten memori anumerta.
sumber