Situasi: - Ada modul di project_folder saya yang disebut kalender - Saya ingin menggunakan kelas Kalender bawaan dari perpustakaan Python - Ketika saya menggunakan kalender impor kalender mengeluh karena mencoba memuat dari modul saya.
Saya telah melakukan beberapa pencarian dan sepertinya saya tidak dapat menemukan solusi untuk masalah saya.
- Bagaimana cara mengakses modul pustaka standar dengan Python ketika ada modul lokal dengan nama yang sama?
- http://docs.python.org/whatsnew/2.5.html
- Bagaimana cara menghindari penulisan nama modul setiap saat saat mengimpor modul dengan python?
Ada ide tanpa harus mengganti nama modul saya?
Jawaban:
Solusi yang diterima berisi pendekatan yang sekarang tidak digunakan lagi.
Dokumentasi importlib di sini memberikan contoh yang baik tentang cara yang lebih tepat untuk memuat modul langsung dari jalur file untuk python> = 3.5:
Jadi, Anda dapat memuat file .py apa pun dari jalur dan mengatur nama modul menjadi apa pun yang Anda inginkan. Jadi sesuaikan saja
module_name
menjadi nama kustom apa pun yang Anda inginkan untuk modul saat mengimpor.Untuk memuat paket, bukan satu file,
file_path
harus menjadi jalur ke root paket__init__.py
sumber
file_path=r"C:\Users\My User\My Path\Module File.py"
. Kemudian saya meneleponmodule_name
seperti modul yang dirilis sehingga saya memiliki skrip kerja penuh yang, tanpa potongan ini, dapat digunakan pada PC lainTidak perlu mengubah nama modul Anda. Sebaliknya, Anda dapat menggunakan absolute_import untuk mengubah perilaku impor. Misalnya dengan stem / socket.py saya mengimpor modul socket sebagai berikut:
Ini hanya bekerja dengan Python 2.5 ke atas; itu mengaktifkan perilaku yang merupakan default di Python 3.0 dan lebih tinggi. Pylint akan mengeluh tentang kode tersebut tetapi itu benar-benar valid.
sumber
PYTHONPATH
. Pertanyaan lain menunjukkan bagaimana menyelesaikannya.Sebenarnya, menyelesaikan ini agak mudah, tetapi implementasinya akan selalu sedikit rapuh, karena tergantung internal mekanisme impor python dan dapat berubah di versi mendatang.
(kode berikut menunjukkan cara memuat modul lokal dan non-lokal dan bagaimana keduanya dapat hidup berdampingan)
Solusi terbaik, jika memungkinkan, adalah menghindari menamai modul Anda dengan nama yang sama dengan pustaka standar atau nama modul bawaan.
sumber
sys.modules
dan upaya selanjutnya untuk memuat modul lokal?Satu-satunya cara untuk mengatasi masalah ini adalah dengan membajak sendiri mesin impor internal. Ini tidak mudah, dan penuh bahaya. Anda harus menghindari suar berbentuk grail dengan segala cara karena bahayanya terlalu berbahaya.
Ganti nama modul Anda sebagai gantinya.
Jika Anda ingin mempelajari cara membajak mesin impor internal, inilah tempat yang akan Anda tuju untuk mengetahui cara melakukan ini:
Terkadang ada alasan bagus untuk terlibat dalam bahaya ini. Alasan Anda memberi tidak ada di antara mereka. Ubah nama modul Anda.
Jika Anda mengambil jalur yang berbahaya, satu masalah yang akan Anda temui adalah ketika Anda memuat modul, modul itu berakhir dengan 'nama resmi' sehingga Python dapat menghindari keharusan mengurai konten modul itu lagi. Pemetaan 'nama resmi' modul ke objek modul itu sendiri dapat ditemukan di
sys.modules
.Ini berarti bahwa jika Anda berada
import calendar
di satu tempat, modul apa pun yang diimpor akan dianggap sebagai modul dengan nama resmicalendar
dan semua upaya lain keimport calendar
tempat lain, termasuk di kode lain yang merupakan bagian dari pustaka utama Python, akan mendapatkan kalender itu.Dimungkinkan untuk mendesain importir pelanggan menggunakan modul imputil dengan Python 2.x yang menyebabkan modul dimuat dari jalur tertentu untuk mencari modul yang mereka impor dalam sesuatu selain yang
sys.modules
pertama atau sesuatu seperti itu. Tapi itu hal yang sangat sulit untuk dilakukan, dan itu tidak akan berhasil dengan Python 3.x.Ada hal yang sangat jelek dan mengerikan yang dapat Anda lakukan tanpa melibatkan mekanisme impor. Ini adalah sesuatu yang mungkin tidak Anda lakukan, tetapi kemungkinan besar akan berhasil. Ini mengubah
calendar
modul Anda menjadi hibrida dari modul kalender sistem dan modul kalender Anda. Terima kasih kepada Boaz Yaniv untuk kerangka fungsi yang saya gunakan . Letakkan ini di awalcalendar.py
file Anda :sumber
code
modul std Python ), yang berarti hanya sebagian kecil pengembang yang pernah memiliki masalah dengan "merging hack" ini. Pengguna tidak akan terpengaruh sama sekali.Saya ingin menawarkan versi saya, yang merupakan kombinasi dari solusi Boaz Yaniv dan Omnifarious. Ini akan mengimpor versi sistem dari modul, dengan dua perbedaan utama dari jawaban sebelumnya:
Letakkan ini di suatu tempat yang dapat diakses sehingga Anda dapat memanggilnya (saya punya milik saya di file __init__.py saya):
Contoh
Saya ingin mengimpor mysql.connection, tetapi saya memiliki paket lokal yang sudah disebut mysql (utilitas resmi mysql). Jadi untuk mendapatkan konektor dari paket sistem mysql, saya mengganti ini:
Dengan ini:
Hasil
sumber
Ubah jalur impor:
sumber
sys.modules
, dan tidak akan mengimpor modul dengan nama yang sama lagi.