Otomasi mengubah pekerjaan yang berulang menjadi skrip yang berjalan tanpa pengawasan, misalnya merapikan folder unduhan, mengarsipkan laporan harian, atau memindahkan berkas hasil ekspor. Topik ini membahas tiga bentuk otomasi, yaitu menjalankan program lain dengan subprocess, menulis bot pengatur berkas dengan pathlib dan shutil, serta menjadwalkan skrip agar berjalan sendiri pada waktu tertentu. Contoh yang dipakai berupa pemeliharaan folder berkas biasa, tanpa layanan luar dan tanpa pustaka tambahan.
Menjalankan program lain dengan subprocess#
Modul subprocess menjalankan program lain sebagai proses baru dan menghubungkan keluarannya kembali ke skrip pemanggil. Fungsi subprocess.run menerima daftar argumen, dan nilai baliknya berupa objek CompletedProcess yang menyimpan kode keluar, stdout, serta stderr. Skrip berikut menjalankan penerjemah Python kedua untuk menghitung 2 pangkat 10, kemudian menjalankan proses yang sengaja berhenti dengan kode keluar 3.
"""Demo subprocess: menjalankan program lain dari dalam skrip Python."""
import subprocess
import sys
# menghitung 2 pangkat 10 pada proses Python yang terpisah
proses = subprocess.run(
[sys.executable, "-c", "print(2 ** 10)"],
capture_output=True,
text=True,
timeout=30,
)
print("kode keluar :", proses.returncode)
print("stdout :", proses.stdout, end="")
# proses yang berhenti dengan kode keluar 3
gagal = subprocess.run([sys.executable, "-c", "raise SystemExit(3)"], timeout=30)
print("kode keluar kedua:", gagal.returncode)kode keluar : 0
stdout : 1024
kode keluar kedua: 3Argumen capture_output=True menangkap stdout dan stderr ke dalam objek, sedangkan text=True mendekode byte menjadi string sehingga tidak perlu decode manual. Argumen timeout=30 membatasi lamanya menunggu. Melebihi batas itu menimbulkan subprocess.TimeoutExpired alih-alih menggantung skrip selamanya.
Kode keluar 0 berarti program berakhir normal, sedangkan angka 3 pada proses kedua muncul karena SystemExit(3) sengaja dilempar. Kode keluar inilah cara sebuah program melaporkan keberhasilannya kepada pemanggil. Nilai sys.executable membuat skrip memakai penerjemah Python yang sama, sehingga contoh tidak bergantung pada letak instalasi Python.
Bot pengatur berkas#
Bot pengatur berkas adalah skrip yang memindahkan, menamai ulang, atau mengarsipkan berkas menurut aturan tetap. Modul pathlib menyediakan kelas Path untuk penelusuran direktori, sedangkan shutil.move memindahkan berkas lintas folder. Skrip rapikan.py berikut memindahkan setiap berkas pada tingkat teratas sebuah folder ke subfolder bernama sesuai ekstensinya, dan berkas tanpa ekstensi dikumpulkan ke folder tanpa-ekstensi.
"""Bot perapik berkas: memindahkan berkas ke folder sesuai ekstensinya."""
import shutil
import sys
from pathlib import Path
def rapikan(direktori: str) -> None:
root = Path(direktori)
for berkas in sorted(root.iterdir()):
if not berkas.is_file():
continue
ekstensi = berkas.suffix.lstrip(".").lower() or "tanpa-ekstensi"
tujuan = root / ekstensi
tujuan.mkdir(exist_ok=True)
shutil.move(str(berkas), str(tujuan / berkas.name))
print(f"{berkas.name} -> {ekstensi}/")
if __name__ == "__main__":
direktori = sys.argv[1] if len(sys.argv) > 1 else "berkas-acak"
Path(direktori).mkdir(exist_ok=True)
rapikan(direktori)Perilakunya dapat diuji dengan menyiapkan folder berisi beberapa berkas acak, lalu menjalankan bot terhadap folder tersebut.
# menyiapkan folder uji dengan beberapa berkas acak
mkdir -p berkas-acak
touch berkas-acak/laporan.txt berkas-acak/foto.png berkas-acak/data.csv berkas-acak/CATATAN
# menjalankan bot perapik terhadap folder tersebut
python3 rapikan.py berkas-acakCATATAN -> tanpa-ekstensi/
data.csv -> csv/
foto.png -> png/
laporan.txt -> txt/Argumen direktori bersifat opsional, karena tanpa argumen, bot mengarah pada folder berkas-acak yang dibuat bila belum ada. Pemanggilan sorted(root.iterdir()) menjaga urutan pemrosesan tetap, sedangkan pernyataan continue melewati folder agar isi subfolder tujuan tidak ikut dipindahkan ulang. Ekstensi diubah ke huruf kecil melalui lower(), sehingga LAPORAN.TXT dan laporan.txt masuk ke folder txt yang sama, dan berkas tersembunyi berawalan titik seperti .gitignore ikut dirapikan karena atribut suffix milik Path tidak memuat apa pun. Bot semacam ini aman dijalankan berulang karena berkas yang sudah dipindahkan tidak lagi berada di tempat pemindaian, dan urutan keluaran mengikuti sorted, sehingga CATATAN dengan huruf kapital muncul lebih dahulu.
Tugas terjadwal#
Skrip otomasi menjadi benar-benar mandiri apabila dijadwalkan, yaitu dijalankan sistem pada waktu yang ditetapkan tanpa campur tangan. Di Linux dan macOS, penjadwal bawaan bernama cron dan daftar tugasnya disunting melalui perintah crontab. Entri cron berikut menjalankan bot perapik setiap pukul 06.00.
# tidak-dijalankan: entri ini milik tabel cron, bukan perintah terminal biasa
# menjalankan rapikan.py setiap pukul 06.00
0 6 * * * cd /home/ali/otomasi && /usr/bin/python3 rapikan.py /home/ali/berkas-acakLima kolom pertama menyatakan menit, jam, hari dalam bulan, bulan, dan hari dalam minggu, sedangkan tanda bintang berarti setiap nilai yang mungkin. Di Windows, Windows Task Scheduler menyediakan fungsi yang sama melalui antarmuka grafisnya. Jalur penerjemah ditulis lengkap karena lingkungan cron tidak selalu mewarisi PATH dari sesi terminal, sehingga /usr/bin/python3 menjaga agar tugas dijalankan oleh penerjemah yang dimaksud.
Tugas terjadwal juga perlu dirancang untuk gagal dengan aman. Cron pada banyak sistem mengirim keluaran dan pesan error melalui surel lokal secara default, sedangkan pengalihan ke berkas log pada entrinya membuat jejaknya lebih mudah diperiksa kembali. Bot yang dijadwalkan sebaiknya mengembalikan kode keluar yang tidak nol ketika pekerjaannya gagal, sehingga pemantauan cukup membaca kode tersebut alih-alih menelusuri teks log setiap malam.
Alternatif kedua adalah penjadwal di dalam proses, yaitu perulangan tanpa henti yang memanggil pekerjaan lalu tidur sampai jadwal berikutnya.
# tidak-dijalankan: perulangan tak berujung menahan eksekusi selamanya
import time
while True:
rapikan("berkas-acak")
time.sleep(24 * 60 * 60)Bentuk ini berguna ketika skrip memang sudah berjalan terus sebagai bagian dari layanan yang lebih besar. Konsekuensinya, pekerjaan berhenti setiap kali prosesnya berhenti, sehingga penjadwalan sistem seperti cron tetap menjadi pilihan utama untuk tugas yang harus berdiri sendiri.
Kesalahan umum#
Kesalahan pertama adalah menjalankan bot terhadap folder yang salah, misalnya folder proyek yang masih memuat kode sumber. Bot yang memindahkan berkas menurut ekstensi tidak membedakan berkas hasil kerja dari berkas lainnya, sehingga satu argumen yang keliru dapat merapikan folder yang tidak seharusnya. Kebiasaan yang aman adalah menguji bot terhadap folder tiruan terlebih dahulu sebagaimana contoh di atas, atau menambahkan konfirmasi pada pemanggilan pertama terhadap folder nyata.
Kesalahan kedua adalah mengandalkan jalur relatif pada tugas terjadwal. Cron menjalankan perintah dari direktori home, sehingga python3 rapikan.py berkas-acak tanpa perpindahan direktori memeriksa folder yang salah atau gagal menemukan berkasnya. Entri cron pada bagian sebelumnya menghindari jebakan ini dengan cd ke folder proyek terlebih dahulu, dan pola yang sama berlaku untuk setiap skrip yang dipanggil cron.
Kesalahan ketiga adalah mengandalkan print sebagai satu-satunya jejak. Pada tugas terjadwal, keluaran print tidak dilihat oleh siapa pun, sehingga kegagalan baru ketahuan berminggu-minggu kemudian. Modul logging yang menulis ke berkas memungkinkan hasil setiap eksekusi diperiksa kembali, dan kebutuhan ini muncul segera setelah bot mulai dijadwalkan.
Ringkasan#
subprocess.runmenjalankan program lain sebagai proses baru dan mengembalikan kode keluar beserta stdout dan stderr yang tertangkap.- Bot pengatur berkas mengombinasikan pathlib untuk penelusuran direktori dan
shutil.moveuntuk pemindahan sesuai aturan ekstensi. - cron menjadwalkan skrip melalui lima kolom jadwal, sedangkan perulangan dengan
time.sleepmenjadwalkan pekerjaan dari dalam proses. - Skrip otomasi sebaiknya aman dijalankan berulang, dan bentuk daftar argumen pada subprocess menghindari celah injection.
Referensi#
- subprocess — Python Software Foundation — Dokumentasi resmi modul subprocess, termasuk subprocess.run dan catatan keamanan shell=True.
- pathlib — Python Software Foundation — Dokumentasi resmi kelas Path untuk penelusuran direktori dan manipulasi jalur.
- shutil — Python Software Foundation — Dokumentasi resmi operasi berkas tingkat tinggi seperti shutil.move.