Bayangkan Anda ingin mengembangkan aplikasi desktop pengguna akhir (bukan web) yang tidak sepele dengan Python. Apa cara terbaik untuk menyusun hierarki folder proyek?
Fitur yang diinginkan adalah kemudahan perawatan, keramahan IDE, kesesuaian untuk percabangan / penggabungan kontrol sumber, dan pembuatan paket instalasi yang mudah.
Khususnya:
- Di mana Anda meletakkan sumbernya?
- Di mana Anda meletakkan skrip startup aplikasi?
- Di mana Anda meletakkan proyek IDE cruft?
- Di mana Anda menempatkan tes unit / penerimaan?
- Di mana Anda meletakkan data non-Python seperti file konfigurasi?
- Di mana Anda meletakkan sumber non-Python seperti C ++ untuk modul ekstensi pyd / binary?
Menurut struktur Filesystem Jean-Paul Calderone dari proyek Python :
sumber
Project/project/
? Ah, yang kedua adalah nama paketnya.../
dalam pernyataan include)pip install -e /path/to/Project
)-e
bendera, yang menginstal paket sebagai paket yang dapat diedit, yaitu menginstalnya sebagai tautan ke folder proyek yang sebenarnya. Dapat dieksekusi kemudian hanyaimport project
memiliki akses ke modul.Posting blog ini oleh Jean-Paul Calderone umumnya diberikan sebagai jawaban dalam #python di Freenode.
sumber
Lihat Sumber Terbuka Proyek Python dengan Cara yang Benar .
Biarkan saya kutip bagian tata letak proyek dari artikel yang sangat baik:
sumber
Makefile
pada tingkat yang samasetup.py
? Jadi jika saya mengerti Andamake env
mengotomatiskan pembuatan yang baruvenv
dan instal paket ke dalamnya ...?"Otoritas Pengemasan Python" memiliki proyek sampl:
https://github.com/pypa/sampleproject
Ini adalah proyek sampel yang ada sebagai bantuan untuk Tutorial Panduan Pengguna Kemasan Python tentang Proyek Pengemasan dan Distribusi.
sumber
root/src/*
struktur: github.com/pypa/sampleproject/commit/…Coba mulai proyek menggunakan templat python_boilerplate . Ini sebagian besar mengikuti praktik terbaik (misalnya yang ada di sini ), tetapi lebih cocok jika Anda merasa ingin membagi proyek Anda menjadi lebih dari satu telur di beberapa titik (dan percayalah, dengan apa pun kecuali proyek paling sederhana, Anda akan melakukannya.) situasi umum adalah ketika Anda harus menggunakan versi perpustakaan orang lain yang dimodifikasi secara lokal).
Di mana Anda meletakkan sumbernya?
PROJECT_ROOT/src/<egg_name>
.Di mana Anda meletakkan skrip startup aplikasi?
entry_point
salah satu dari sel telur.Di mana Anda meletakkan proyek IDE cruft?
PROJECT_ROOT/.<something>
di root proyek, dan ini baik-baik saja.Di mana Anda menempatkan tes unit / penerimaan?
PROJECT_ROOT/src/<egg_name>/tests
direktori. Saya pribadi lebih suka menggunakanpy.test
untuk menjalankannya.Di mana Anda meletakkan data non-Python seperti file konfigurasi?
pkg_resources
paket darisetuptools
, atau karena Python 3.7 melaluiimportlib.resources
modul dari pustaka standar.PROJECT_ROOT/config
. Untuk penyebaran bisa ada berbagai opsi. Di Windows seseorang dapat menggunakan%APP_DATA%/<app-name>/config
, di Linux,/etc/<app-name>
atau/opt/<app-name>/config
.PROJECT_ROOT/var
selama pengembangan, dan di bawah/var
selama penyebaran Linux.PROJECT_ROOT/src/<egg_name>/native
Dokumentasi biasanya akan masuk
PROJECT_ROOT/doc
atauPROJECT_ROOT/src/<egg_name>/doc
(ini tergantung pada apakah Anda menganggap beberapa telur sebagai proyek besar yang terpisah). Beberapa konfigurasi tambahan akan ada di file sepertiPROJECT_ROOT/buildout.cfg
danPROJECT_ROOT/setup.cfg
.sumber
base_data_location
variabel, tetapi bagaimana Anda mengaturnya dengan tepat?Dalam pengalaman saya, itu hanya masalah iterasi. Letakkan data dan kode Anda ke mana pun menurut Anda. Kemungkinannya, toh Anda akan salah. Tetapi begitu Anda mendapatkan ide yang lebih baik tentang bagaimana keadaan akan terbentuk, Anda berada dalam posisi yang jauh lebih baik untuk membuat tebakan semacam ini.
Sejauh sumber ekstensi, kami memiliki direktori Code di bawah trunk yang berisi direktori untuk python dan direktori untuk berbagai bahasa lainnya. Secara pribadi, saya lebih cenderung mencoba memasukkan kode ekstensi apa pun ke dalam repositori sendiri di waktu mendatang.
Dengan mengatakan itu, saya kembali ke titik awal saya: jangan terlalu mempermasalahkan hal itu. Letakkan di suatu tempat yang tampaknya bekerja untuk Anda. Jika Anda menemukan sesuatu yang tidak berhasil, itu dapat (dan harus) diubah.
sumber
Data non-python terbaik dibundel di dalam modul Python Anda menggunakan
package_data
dukungan di setuptools . Satu hal yang saya sangat sarankan adalah menggunakan paket namespace untuk membuat ruang nama bersama yang dapat digunakan beberapa proyek - mirip dengan konvensi Java untuk memasukkan paketcom.yourcompany.yourproject
(dan dapat memilikicom.yourcompany.utils
namespace bersama ).Bercabang kembali dan menggabungkan, jika Anda menggunakan sistem kontrol sumber yang cukup baik, ia akan menangani penggabungan bahkan melalui penggantian nama; Bazaar sangat pandai dalam hal ini.
Bertentangan dengan beberapa jawaban lain di sini, saya +1 memiliki
src
direktori tingkat atas (dengandoc
dantest
direktori di samping). Konvensi khusus untuk pohon direktori dokumentasi akan bervariasi tergantung pada apa yang Anda gunakan; Sphinx , misalnya, memiliki konvensi sendiri yang didukung oleh alat cepatnya.Tolong, tolong manfaatkan setuptools dan pkg_resources; ini membuatnya lebih mudah bagi proyek lain untuk bergantung pada versi spesifik kode Anda (dan untuk beberapa versi diinstal secara bersamaan dengan file non-kode yang berbeda, jika Anda menggunakan
package_data
).sumber