Bagaimana cara saya membuatnya setup.py
menyertakan file yang bukan bagian dari kode? (Secara khusus, ini adalah file lisensi, tetapi bisa juga hal lain.)
Saya ingin dapat mengontrol lokasi file. Di folder sumber asli, file tersebut di root paket. (Yaitu pada tingkat yang sama dengan yang paling atas __init__.py
.) Saya ingin tetap persis di sana ketika paket diinstal, terlepas dari sistem operasi. Bagaimana aku melakukan itu?
data_files = [('', ['lgpl2.1_license.txt',]),]
menempatkannya di folder Python26.Jawaban:
Mungkin cara terbaik untuk melakukan ini adalah dengan menggunakan
setuptools
package_data
arahan. Ini berarti menggunakansetuptools
(ataudistribute
) alih-alihdistutils
, tetapi ini adalah "peningkatan" yang sangat mulus.Berikut ini contoh lengkap (tetapi belum teruji):
Perhatikan baris spesifik yang sangat penting di sini:
package_data
adalahdict
nama paket (kosong = semua paket) ke daftar pola (dapat menyertakan gumpalan). Misalnya, jika Anda hanya ingin menentukan file di dalam paket Anda, Anda dapat melakukannya juga:Solusinya di sini jelas bukan untuk mengganti nama non-
py
file Anda dengan a.py
ekstensi.Lihat presentasi Ian Bicking untuk info lebih lanjut.
UPDATE: Pendekatan [Lebih Baik] Lain
Pendekatan lain yang berfungsi dengan baik jika Anda hanya ingin mengontrol konten distribusi sumber (
sdist
) dan memiliki file di luar paket (misalnya direktori tingkat atas) adalah menambahkanMANIFEST.in
file. Lihat dokumentasi Python untuk format file ini.Sejak menulis respons ini, saya telah menemukan bahwa menggunakan
MANIFEST.in
biasanya merupakan pendekatan yang kurang membuat frustrasi untuk memastikan distribusi sumber Anda (tar.gz
) memiliki file yang Anda butuhkan.Misalnya, jika Anda ingin memasukkan
requirements.txt
dari tingkat atas, secara rekursif sertakan direktori "data" tingkat atas:Namun demikian, agar file-file ini dapat disalin pada waktu instalasi ke folder paket di dalam paket-situs, Anda harus menyediakan
include_package_data=True
kesetup()
fungsi tersebut. Lihat Menambahkan File Non-Kode untuk informasi lebih lanjut.sumber
Untuk mencapai apa yang Anda gambarkan akan diperlukan dua langkah ...
Langkah 1: Untuk menambahkan file ke tarball sumber, sertakan di MANIFEST
Buat template MANIFEST di folder yang berisi setup.py
MANIFEST pada dasarnya adalah file teks dengan daftar semua file yang akan dimasukkan dalam tarball sumber.
Seperti inilah tampilan MANIFEST untuk proyek saya:
Catatan: Sementara sdist tidak menambahkan beberapa file secara otomatis , saya lebih memilih untuk secara eksplisit menentukan mereka untuk memastikan bukannya memprediksi apa yang dilakukan dan tidak.
Langkah 2: Untuk menginstal file data ke folder sumber, ubah setup.py
Karena Anda ingin menambahkan file data (LICENSE.txt) ke folder instal sumber, Anda perlu memodifikasi jalur instal data agar sesuai dengan path instal sumber. Ini diperlukan karena, secara default, file data dipasang ke lokasi yang berbeda dari file sumber.
Untuk mengubah dir instalasi data agar sesuai dengan dir ...
Tarik info instal dir dari distutils dengan:
Ubah direktori pemasangan data agar sesuai dengan direktori pemasangan sumber:
Dan, tambahkan file data dan lokasi ke setup ():
Catatan: Langkah-langkah di atas harus mencapai apa yang Anda jelaskan dengan cara standar tanpa memerlukan pustaka ekstensi apa pun.
sumber
package_data
tidak berfungsi jika file tidak ada dalam paket.buat
MANIFEST.in
di root proyek denganrecursive-include
ke direktori yang diperlukan atauinclude
dengan nama file.dokumentasi dapat ditemukan di sini
sumber
Saya ingin mengirim komentar ke salah satu pertanyaan tetapi saya tidak memiliki reputasi yang cukup untuk melakukan itu>.>
Inilah yang bekerja untuk saya (muncul setelah merujuk dokumen):
Baris terakhir, anehnya, juga penting bagi saya (Anda juga dapat menghilangkan argumen kata kunci ini - kerjanya sama).
Apa yang dilakukan adalah menyalin semua file teks di direktori tingkat atas atau root Anda (satu tingkat lebih tinggi dari paket
mypkg
yang ingin Anda bagikan).Semoga ini membantu!
sumber
MANIFEST.in
, ini berhasil untuk saya. Baris terakhir juga penting bagi saya. Baris saya adalahinclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Langkah 1: buat
MANIFEST.in
file di folder yang sama dengan setup.pyLangkah 2: sertakan jalur relatif ke file yang ingin Anda tambahkan
MANIFEST.in
Langkah 3: atur
include_package_data=True
dalamsetup()
fungsi untuk menyalin file-file ini ke paket situsReferensi ada di sini.
sumber
Ini tahun 2019, dan inilah yang berfungsi - meskipun ada saran di sana-sini, apa yang saya temukan di internet setengah didokumentasikan menggunakan
setuptools_scm
, disahkan sebagai opsi untuksetuptools.setup
. Ini akan mencakup semua file data yang diversi pada VCS Anda, baik itu git atau yang lain, ke paket roda, dan akan membuat "pip install" dari repositori git untuk membawa file-file itu.Jadi, saya baru saja menambahkan dua baris ini ke panggilan pengaturan pada "setup.py". Tidak diperlukan pemasangan atau impor tambahan:
Tidak perlu mendaftar secara manual package_data, atau dalam file MANIFEST.in - jika sudah diversi, itu sudah termasuk dalam paket. Dokumen pada "setuptools_scm" menekankan pada pembuatan nomor versi dari posisi komit, dan mengabaikan bagian yang sangat penting dari menambahkan file data. (Saya tidak peduli jika file roda perantara saya dinamai "* 0.2.2.dev45 + g3495a1f" atau akan menggunakan nomor versi hardcoded "0.3.0dev0" yang saya ketikkan - tetapi meninggalkan file penting untuk program agar kerja di belakang agak penting)
sumber
Di setup.py di bawah pengaturan (:
sumber
package_data
akan mempengaruhi apa yangsetup.py install
dilakukan, kecuali jika Anda memodifikasi perintah instal itu sendiri. Kecuali jika file-file tersebut berada di bawah direktori paket, yang biasanya merupakan sesuatu yang ingin Anda hindari.Ini jawaban sederhana yang berhasil buat saya.
Pertama, sesuai komentar Python Dev di atas, setuptools tidak diperlukan:
Itu bagus karena meletakkan persyaratan setuptools pada paket Anda berarti Anda harus menginstalnya juga. Pendeknya:
sumber
pkgame
tidak adaSaya hanya ingin menindaklanjuti sesuatu yang saya temukan bekerja dengan Python 2.7 pada Centos 6. Menambahkan package_data atau data_files seperti yang disebutkan di atas tidak bekerja untuk saya. Saya menambahkan MANIFEST.IN dengan file yang saya inginkan yang meletakkan file non-python ke tarball, tetapi tidak menginstalnya pada mesin target melalui RPM.
Pada akhirnya, saya bisa memasukkan file ke dalam solusi saya menggunakan "opsi" di setup / setuptools. File opsi memungkinkan Anda memodifikasi berbagai bagian file spesifikasi dari setup.py. Sebagai berikut.
file - MANIFEST.in:
file - filewengan perintah instal:
sumber
Menemukan solusi: Saya mengganti nama saya
lgpl2.1_license.txt
menjadilgpl2.1_license.txt.py
, dan menaruh beberapa tanda kutip di sekitar teks. Sekarang saya tidak perlu menggunakandata_files
opsi atau untuk menentukan jalur absolut. Membuatnya modul Python jelek, saya tahu, tapi saya menganggapnya kurang jelek daripada menentukan jalur absolut.sumber