Apa tujuan argumen namespace_packages di setup.py saat bekerja dengan paket namespace PEP420 (yang tanpa __init__.py)?

Saya memainkannya dan melihat tidak ada perbedaan apakah saya mendeklarasikan paket namespace atau tidak. "setup.py install" dan "pip install ." bekerja dalam hal apapun.

Saya sedang membangun pembuat kode setup.py otomatis dan akan senang untuk tidak menangani ini jika ini tidak perlu.

2
Lior Cohen 10 Mei 2018, 22:24

2 jawaban

Jawaban Terbaik

Selama Anda:

  • bertujuan untuk Python 3.3 dan yang lebih baru atau Python 2.7 dengan dependensi importlib2 terpasang (backport importlib untuk Python 2),
  • gunakan versi setuptools terbaru untuk pengemasan (saya pikir seharusnya 28,8 atau lebih baru)
  • dan gunakan versi pip terbaru untuk menginstal (9.0 dan yang lebih baru akan baik-baik saja, 8.1.2 mungkin juga berfungsi, tetapi Anda harus mengujinya sendiri),

Anda berada di sisi yang aman dan dapat dengan aman menghilangkan argumen kata kunci namespace_packages di skrip penyiapan Anda.

Ada repositori resmi PyPA bernama sample-namespace-packages di GitHub yang berisi suite pengujian untuk berbagai kemungkinan skenario distribusi yang diinstal yang berisi paket namespace dari masing-masing jenis. Seperti yang Anda lihat, paket sampel yang menggunakan paket namespace implisit tidak menggunakan argumen namespace_packages dalam skrip penyiapannya (ini adalah salah satu skrip) dan semua pengujian jenis pep420 dan cross_pep420_pkgutil diteruskan dengan Python 3; ini tabel hasil lengkap.

2
hoefling 12 Mei 2018, 08:03

Paket namespace adalah paket terpisah yang diinstal di bawah satu nama tingkat atas.

Biasanya dua paket berbeda (misalnya SQLObject dan Cheetah3) instal dua (atau lebih) paket tingkat atas yang berbeda (sqlobject dan Cheetah dalam contoh saya).

Tetapi bagaimana jika saya memiliki perpustakaan yang ingin saya bagi menjadi beberapa bagian dan memungkinkan untuk menginstal bagian-bagian ini tanpa sisa perpustakaan? Saya menggunakan paket namespace. Contoh: kedua paket ini adalah 2 bagian dari satu pustaka: m_lib dan m_lib.defenc. Satu menginstal m_lib/defenc.py yang dapat digunakan secara terpisah, yang lain menginstal sisa pustaka m_lib. Untuk menginstal seluruh library sekaligus saya juga menyediakan m_lib.full.

PS. Semua paket yang disebutkan adalah milik saya. Kode sumber disediakan di Github atau hosting git pribadi saya.

0
phd 10 Mei 2018, 23:29