Saya memposting jawaban yang sama juga untuk pertanyaan tentang impor dari paket saudara. Anda bisa melihatnya di sini .
Solusi tanpa sys.path
peretasan
Ringkasan
- Bungkus kode ke dalam satu folder (misalnya
packaged_stuff
)
- Gunakan buat
setup.py
skrip tempat Anda menggunakan setuptools.setup () .
- Pip instal paket dengan status yang dapat diedit
pip install -e <myproject_folder>
- Impor menggunakan
from packaged_stuff.modulename import function_name
Mendirikan
Saya menganggap struktur folder yang sama seperti pada pertanyaan
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Saya memanggil .
folder root, dan dalam kasus saya ini terletak di C:\tmp\test_imports
.
Langkah
1) Tambahkan setup.py
ke folder root
Isi dari setup.py
bisa sederhana
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Pada dasarnya "apapun" setup.py
akan berhasil. Ini hanya contoh kerja minimal.
2) Gunakan lingkungan virtual
Jika Anda terbiasa dengan lingkungan virtual, aktifkan satu, dan lewati ke langkah berikutnya. Penggunaan lingkungan virtual tidak mutlak diperlukan, tetapi mereka benar - benar akan membantu Anda dalam jangka panjang (ketika Anda memiliki lebih dari 1 proyek yang sedang berlangsung ..). Langkah paling dasar adalah (dijalankan di folder root)
- Buat virtual env
- Aktifkan virtual env
. /venv/bin/activate
(Linux) atau ./venv/Scripts/activate
(Menang)
Untuk mempelajari lebih lanjut tentang ini, cukup Google "tutorial python virtualenv" atau serupa. Anda mungkin tidak pernah membutuhkan perintah selain membuat, mengaktifkan, dan menonaktifkan.
Setelah Anda membuat dan mengaktifkan lingkungan virtual, konsol Anda harus memberi nama lingkungan virtual dalam tanda kurung
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) pip instal proyek Anda dalam keadaan dapat diedit
Instal paket tingkat atas Anda myproject
menggunakan pip
. Caranya adalah dengan menggunakan -e
bendera saat melakukan instalasi. Dengan cara ini diinstal dalam keadaan dapat diedit, dan semua pengeditan yang dilakukan pada file .py akan secara otomatis disertakan dalam paket yang diinstal.
Di direktori root, jalankan
pip install -e .
(perhatikan titik, singkatan dari "direktori saat ini")
Anda juga dapat melihat bahwa itu diinstal dengan menggunakan pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4) Impor dengan menambahkan mainfolder
ke setiap impor
Dalam contoh ini, mainfolder
akan menjadi ptdraft
. Ini memiliki keuntungan bahwa Anda tidak akan mengalami tabrakan nama dengan nama modul lain (dari pustaka standar python atau modul pihak ke-3).
Contoh Penggunaan
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
Menjalankan life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!