Jika saya pindah CreateUser.py
ke direktori utama user_management, saya dapat dengan mudah menggunakan: import Modules.LDAPManager
untuk mengimpor LDAPManager.py
--- ini berfungsi.
Tolong, jangan . Dengan cara ini LDAPManager
modul yang digunakan oleh CreateUser
akan tidak sama dengan yang diimpor melalui impor lainnya. Ini dapat menimbulkan masalah ketika Anda memiliki beberapa status global dalam modul atau selama pengawetan / pembongkaran. Menghindari impor yang hanya berfungsi karena modul berada di direktori yang sama.
Ketika Anda memiliki struktur paket, Anda harus:
Gunakan impor relatif, yaitu jika CreateUser.py
ada di Scripts/
:
from ..Modules import LDAPManager
Perhatikan bahwa ini adalah (catatan masa lalu tegang) berkecil hati dengan PEP 8 hanya karena versi lama python tidak mendukung mereka sangat baik, tapi masalah ini diselesaikan tahun yang lalu. The sekarang versi PEP 8 tidak menunjukkan mereka sebagai alternatif yang dapat diterima untuk impor mutlak. Saya sebenarnya suka mereka di dalam paket.
Gunakan impor absolut menggunakan seluruh nama paket ( CreateUser.py
dalam Scripts/
):
from user_management.Modules import LDAPManager
Agar yang kedua berfungsi, paket user_management
harus diinstal di dalam PYTHONPATH
. Selama pengembangan, Anda dapat mengonfigurasi IDE agar hal ini terjadi, tanpa harus menambahkan panggilan ke sys.path.append
mana pun secara manual .
Juga saya merasa aneh bahwa itu Scripts/
adalah sub-paket. Karena dalam instalasi nyata user_management
modul akan dipasang di bawah site-packages
berhasil ditemukan dalam lib/
direktori (mana direktori yang digunakan untuk menginstal perpustakaan di OS Anda), sedangkan script harus dipasang di bawah bin/
direktori (yang mana berisi executable untuk OS Anda).
Bahkan saya percaya Script/
seharusnya tidak berada di bawah user_management
. Itu harus pada level yang sama user_management
. Dengan cara ini Anda tidak perlu menggunakan -m
, tetapi Anda hanya perlu memastikan paket tersebut dapat ditemukan (lagi-lagi ini adalah masalah konfigurasi IDE, menginstal paket dengan benar atau menggunakan PYTHONPATH=. python Scripts/CreateUser.py
untuk meluncurkan skrip dengan jalur yang benar).
Singkatnya, hierarki yang akan saya gunakan adalah:
user_management (package)
|
|------- __init__.py
|
|------- Modules/
| |
| |----- __init__.py
| |----- LDAPManager.py
| |----- PasswordManager.py
|
Scripts/ (*not* a package)
|
|----- CreateUser.py
|----- FindUser.py
Kemudian kode CreateUser.py
dan FindUser.py
harus menggunakan impor absolut untuk mengimpor modul:
from user_management.Modules import LDAPManager
Selama instalasi Anda memastikan bahwa itu user_management
berakhir di suatu tempat di PYTHONPATH
, dan skrip di dalam direktori untuk executable sehingga mereka dapat menemukan modul. Selama pengembangan, Anda bergantung pada konfigurasi IDE, atau Anda meluncurkan CreateUser.py
penambahan Scripts/
direktori induk ke PYTHONPATH
(maksud saya direktori yang berisi user_management
dan Scripts
):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
Atau Anda dapat memodifikasi PYTHONPATH
secara global sehingga Anda tidak perlu menentukan ini setiap saat. Pada OS unix (linux, Mac OS X, dll.) Anda dapat mengubah salah satu skrip shell untuk menentukan PYTHONPATH
variabel eksternal, pada Windows Anda harus mengubah pengaturan variabel lingkungan.
Tambahan saya percaya, jika Anda menggunakan python2, lebih baik memastikan untuk menghindari impor relatif implisit dengan meletakkan:
from __future__ import absolute_import
di bagian atas modul Anda. Dengan cara ini import X
selalu berarti untuk mengimpor toplevel modul X
dan tidak akan pernah mencoba untuk mengimpor X.py
file yang ada di direktori yang sama (jika direktori yang tidak di PYTHONPATH
). Dengan cara ini satu - satunya cara untuk melakukan impor relatif adalah dengan menggunakan sintaks eksplisit (the from . import X
), yang lebih baik ( eksplisit lebih baik daripada implisit ).
Ini akan memastikan Anda tidak pernah menggunakan impor relatif implisit yang "palsu", karena ini akan memunculkan ImportError
sinyal yang jelas bahwa ada sesuatu yang salah. Jika tidak, Anda dapat menggunakan modul yang bukan seperti yang Anda pikirkan.
python -m user_management.Scripts.CreateUser