Seluruh jembatan Python dimulai dari satu panggilan fungsi. Topik ini membahas cara memuat modul Python dari Mojo melalui Python.import_module, bagaimana nilai modul yang dikembalikan disimpan dalam PythonObject, cara mengimpor berkas Python yang ditulis sendiri, serta error yang muncul apabila modul tidak ditemukan. Setelah topik ini dibaca, modul Python bawaan maupun buatan sendiri dapat dimuat dan dipanggil dari program Mojo dengan benar.
Memanggil Python.import_module#
Panggilan Python.import_module("numpy") setara dengan pernyataan import numpy as np di Python. Fungsi ini mengembalikan referensi modul dalam bentuk PythonObject, yakni tipe wrapper yang membungkus objek Python, dan referensi itu wajib disimpan dalam variabel sebelum anggota modulnya dipanggil. Pemanggilan berada di dalam fungsi, karena Mojo belum mendukung kode top-level, yaitu pernyataan yang berada di luar fungsi apa pun. Fungsi yang memuatnya juga wajib dinyatakan raises, sebab import_module dapat menghasilkan error apabila modul tidak ditemukan.
Program berikut memuat NumPy, menghitung jumlah sepuluh bilangan pertama di sisi Python, lalu memeriksa tipenya lewat modul builtins. Modul builtins memuat fungsi bawaan Python seperti type, len, dan print, dan dimuat dengan cara yang sama seperti modul mana pun. Simpan kode berikut sebagai impor-modul.mojo.
from std.python import Python
def main() raises:
var np = Python.import_module("numpy")
var a = np.arange(10)
print(a.sum())
print(a.dtype)
var builtins = Python.import_module("builtins")
print(builtins.type(a))# jalankan program impor modul
mojo run impor-modul.mojo45
int64
<class 'numpy.ndarray'>Keluaran memperlihatkan tiga hal sekaligus. Nilai 45 berasal dari a.sum() yang dihitung NumPy pada array bilangan bulat, sehingga hasilnya dicetak tanpa bagian desimal. Nilai int64 berasal dari atribut dtype yang membaca tipe data elemen array, dan <class 'numpy.ndarray'> berasal dari fungsi type milik builtins. Ketiganya menyatakan satu hal yang sama untuk program campuran, yaitu seluruh kemampuan NumPy dapat dipanggil dari Mojo apa adanya.
Mojo tidak menyertakan interpreter CPython sendiri, melainkan menggunakan interpreter Python yang tersedia pada lingkungan tempat program dijalankan, termasuk seluruh paket yang terpasang di sana. Karena itu, pesan No module named sering berarti paketnya terpasang di lingkungan Python yang berbeda dari lingkungan yang dibaca Mojo. Dokumentasi resmi menyarankan pengelolaan proyek dengan pixi atau uv agar versi Python, paket pihak ketiga, dan berkas Mojo berbagi satu lingkungan yang sama, sehingga hasil eksekusi konsisten antarmesin.
PythonObject sebagai wrapper#
Setiap nilai yang datang dari Python, baik modul, array, maupun hasil fungsi, tiba di Mojo dalam bentuk PythonObject. Wrapper ini mendukung sebagian besar kebiasaan Python di Mojo, yaitu akses atribut dengan notasi titik, pengindeksan dengan kurung siku, dan perulangan for-in. Akses tersebut diteruskan langsung ke objek Python di baliknya, sehingga np.arange dan builtins.type terasa seperti menulis Python. Batasnya jelas pada satu hal, yaitu modul tidak dapat diimpor sebagian, misalnya hanya satu fungsi, sehingga seluruh modul dimuat dan anggotanya diakses lewat nilai modul tersebut.
# tidak-dijalankan: fragmen konsep
var builtins = Python.import_module("builtins")
var tipe_data = builtins.type(a)
print(tipe_data)Fragmen di atas menunjukkan pola yang sama dengan program sebelumnya, yaitu menyimpan nilai modul dalam satu variabel lalu memanggil anggotanya dengan notasi titik. Variabel a pada fragmen menyatakan array yang sudah dibuat sebelumnya. Pola ini berlaku untuk modul apa pun, baik milik pustaka standar Python, paket pihak ketiga, maupun berkas lokal yang ditulis sendiri.
Mengimpor modul Python lokal#
Berkas Python buatan sendiri dimuat setelah direktorinya didaftarkan ke jalur Python melalui Python.add_to_path("."). Argumen titik menyatakan direktori kerja saat program dijalankan, dan jalur absolut juga diterima. Berkas modulku.py berikut berisi dua fungsi Python biasa tanpa sentuhan Mojo, yaitu penyapa sederhana dan penghitung rata-rata.
def sambut(nama):
return "Halo, " + nama + "!"
def rata_rata(nilai):
return sum(nilai) / len(nilai)Program Mojo berikut mendaftarkan direktori kerja, memuat modul tersebut, lalu memanggil kedua fungsinya. Argumen yang dikirim melintasi batas secara otomatis, termasuk list Python yang dibangun dengan Python.list(80, 75, 90, 85), sebagaimana dibahas lebih rinci pada topik konversi nilai.
from std.python import Python
def main() raises:
Python.add_to_path(".")
var modulku = Python.import_module("modulku")
var pesan = modulku.sambut("Mojo")
print(pesan)
var nilai = Python.list(80, 75, 90, 85)
var rata = modulku.rata_rata(nilai)
print(rata)# jalankan program impor modul lokal
mojo run impor-lokal.mojoHalo, Mojo!
82.5Fungsi sambut mengembalikan string Python yang tiba sebagai PythonObject dan langsung tercetak, sedangkan rata_rata menerima list Python, melakukan perhitungannya di Python, dan mengembalikan nilai 82.5. Kedua fungsi sama sekali tidak mengetahui bahwa pemanggilnya adalah Mojo, karena dari sisi Python pemanggilan dari Mojo tidak berbeda dengan pemanggilan dari Python. Sifat inilah yang membuat berkas Python yang sudah teruji dapat digunakan kembali tanpa penyesuaian.
Kesalahan umum#
Error yang paling sering muncul adalah nama modul yang tidak ditemukan. Program berikut sengaja memuat modul yang tidak ada, dan errornya ditangkap dengan try-except agar program tetap berakhir rapi. Simpan kode berikut sebagai impor-gagal.mojo.
from std.python import Python
def main() raises:
try:
var hilang = Python.import_module("modul_tidak_ada")
print(hilang)
except e:
print("error:", e)# jalankan program impor yang gagal
mojo run impor-gagal.mojoerror: No module named 'modul_tidak_ada'Pesan No module named muncul dalam dua keadaan. Pertama, nama modul salah ketik, dan perbaikannya adalah memastikan nama modul ditulis persis seperti yang tertulis di Python. Kedua, paketnya memang belum terpasang pada lingkungan Python yang digunakan Mojo, dan perbaikannya adalah memasang paket di lingkungan tersebut, bukan di lingkungan lain yang kebetulan juga ada di mesin. Kesalahan lain menyangkut penempatan, yaitu memanggil Python.import_module di luar fungsi, dan compiler menolaknya karena Mojo belum mendukung kode top-level.
Ringkasan#
Python.import_module("nama")memuat modul Python dan mengembalikan nilainya sebagai PythonObject, setara dengan pernyataan import di Python.- Anggota modul diakses lewat notasi titik pada nilai modulnya, sedangkan impor sebagian, yaitu satu fungsi saja, tidak didukung.
- Berkas Python lokal dimuat setelah direktorinya didaftarkan dengan
Python.add_to_path, dan isinya tetap berupa Python biasa. - Error
No module namedberarti nama modul salah atau paket belum terpasang pada lingkungan Python yang digunakan Mojo.
Referensi#
- Calling Python from Mojo — Mojo Manual
— Panduan resmi
Python.import_module,Python.add_to_path, dan modulbuiltinsyang menjadi dasar topik ini. - Mojo Manual — Mojo — Indeks manual resmi Mojo 1.2.0 yang memuat bab Python and C interop.
- Mojo standard library — Mojo
— Referensi tipe
PythonObjectdan fungsiPythonpada pustaka standar.