Saya penggemar berat "alat yang tepat untuk pekerjaan yang tepat". Untuk beberapa hal, alat yang tepat adalah skrip shell. Bagi yang lain, itu adalah Python. Tapi terkadang… keduanya
Sering kali saya menemukan diri saya menulis skrip shell dan menginginkan sedikit kerumitan ekstra daripada yang saya pedulikan dalam skrip shell. Terkadang, lebih mudah menulis beberapa baris dengan Python daripada mencoba mencari tahu dengan skrip shell. Tapi… terkadang juga nyaman untuk tidak memelihara (atau mentransfer) seluruh file Python (. py) untuk memuat logika ini
Ad hoc Python dalam skrip shell
Jadi apa yang dapat Anda lakukan? . Bagaimana Anda bisa melakukan ini? . Sebuah contoh
Hari Tersisa. SH
#!/bin/bash PYCMD=$(cat <<EOF from datetime import datetime first_day_of_new_year = datetime(2022, 1, 1) days_remaining = (first_day_of_new_year - datetime.now()).days print('{} days remaining in this year'.format(days_remaining)) EOF ) python3 -c "$PYCMD" _9
Dan sekarang demi kelengkapan
1 2 0
Lekukan
Ada beberapa cara untuk melakukan string multiline dalam skrip shell, dan yang ini menggunakan dokumen di sini (1 2 1) untuk pengalihan string adalah yang paling bersih dan paling mudah diingat. Karena saya menggunakan spasi dan bukan tab, saya tidak dapat memanfaatkan 1 2 2 menghapus tab di depan, jadi saya harus berhati-hati dengan indentasi saya
Katakanlah kita memiliki kode Python kita yang menjorok ke dalam skrip shell. Mungkin dalam satu lingkaran, atau fungsi seperti ini
1 2 _3
Ini mungkin terlihat baik-baik saja, tetapi sintaksnya tidak benar
1 2 _4
Untuk dokumen di sini dan kode Python, kita perlu menjaga agar kode tidak terindentasi. Berikut adalah bentuk yang benar
1 2 5
Debugging Python di dalam skrip shell
Kode tidak berfungsi seperti yang kita pikirkan sepanjang waktu. Debugging adalah bagian penting dari setiap pengembangan perangkat lunak, dan Anda mungkin perlu men-debug kode Python yang ada langsung di skrip shell Anda juga
Sebagai pemrogram Python, kami cukup familiar dengan menyetel breakpoint dalam kode dengan 1 2 6. Jadi mari kita letakkan breakpoint itu di skrip shell kita dan lihat apa yang terjadi
1 2 7
1 2 _8
Hmmm kami memiliki pengalaman debugging parsial (karena kami meneruskan kode ad hoc ke Python dengan #!/bin/bash PYCMD=$(cat <<EOF from datetime import datetime first_day_of_new_year = datetime(2022, 1, 1) days_remaining = (first_day_of_new_year - datetime.now()).days print('{} days remaining in this year'.format(days_remaining)) EOF ) python3 -c "$PYCMD" 8). Kami dapat menganalisis kode, tetapi sulit untuk mengetahui di mana kami berada, terutama saat kami menelusuri kode, karena tidak dapat menampilkan baris kode apa pun. Biasanya ketika Anda melakukan $ ./days_remaining.sh 335 days remaining in this year 0 di debugger, itu akan mencantumkan baris kode saat ini yang debugger aktif dan beberapa baris kode di sekitarnya. Sangat berguna dan hampir diperlukan untuk debugging yang tepat
Bagaimana kita bisa menyiasatinya?
$ ./days_remaining.sh 335 days remaining in this year 1
$ ./days_remaining.sh 335 days remaining in this year 2
Besar. Sekarang kita dapat men-debug kode Python dengan semua fitur dan kenyamanan pdb
Peringatan dan pemikiran terakhir
Jika Anda menemukan kode Python ad hoc tersemat Anda menjadi panjang, mungkin ide yang bagus untuk memindahkannya ke file terpisah sehingga dapat diuji dan dipelihara dengan benar. Atau bahkan mungkin hanya menulis seluruh utilitas dengan Python dan melupakan pendekatan skrip shell
Mudah-mudahan posting blog ini telah mengilustrasikan fleksibilitas menyematkan kode Python langsung di skrip shell Anda untuk membuat pengalaman pengembangan sedikit lebih baik daripada harus menyelesaikan semua masalah hanya di skrip shell