Saat menggunakan setuptools / distribusikan, saya tidak bisa mendapatkan installer untuk menarik package_data
file apa pun . Semua yang saya baca mengatakan bahwa berikut ini adalah cara yang benar untuk melakukannya. Bisakah seseorang memberi saran?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
di mana myapp/data/
lokasi file data.
python
setuptools
distribute
cmcginty
sumber
sumber
data_files
memecahkan masalah. Tapi ini rawan kesalahan dan tidak "terasa benar" bagi saya. Dapatkah seseorang memverifikasi bahwa itu benar - benar perlu untuk menduplikasi konfigurasi pada keduanyapackage_data
dandata_files
?pyproject.toml
. Tidaksetup.py
diperlukan file.Jawaban:
Saya menyadari bahwa ini adalah pertanyaan lama, tetapi bagi orang-orang yang menemukan jalan mereka di sini melalui Google:
package_data
adalah kebohongan yang rendah dan kotor . Ini hanya digunakan ketika membangun paket biner (python setup.py bdist ...
) tetapi tidak ketika membangun paket sumber (python setup.py sdist ...
). Ini, tentu saja, konyol - orang akan berharap bahwa membangun distribusi sumber akan menghasilkan kumpulan file yang dapat dikirim ke orang lain untuk membangun distribusi biner.Bagaimanapun, menggunakan
MANIFEST.in
akan berfungsi baik untuk distribusi biner dan sumber.sumber
package_data
bekerja untukbdist
dan bukansdist
. Namun ,MANIFEST.in
bekerja untuksdist
, tetapi tidak untukbdist
! Oleh karena itu, yang terbaik yang saya bisa datang dengan adalah untuk mencakup baikpackage_data
danMANIFEST.in
dalam rangka untuk mengakomodasi keduabdist
dansdist
.MANIFEST.in
untuk file yang tidak akan Anda instal, seperti dokumentasi, danpackage_data
untuk file yang Anda gunakan yang bukan kode Python (seperti gambar atau templat).MANIFEST.in
danpackage_data
. TampaknyaMANIFEST.in
mengontrol apa yang termasuk dalam distribusi, dan package_data mengontrol apa yang kemudian disalin ke dir site_packages selama instalasi. Yang membingungkan, path dalamMANIFEST.in
relatif ke lokasi setup.py, danpackage_data
relatif terhadap paket individu (misalnya modul) root.package_data
yang secara otomatis termasuk dalam ZIP jika Anda tidak memiliki file MANIFEST.in yang ada , dan hanya jika Anda menggunakan 2,7+.Saya baru saja mengalami masalah yang sama. Solusinya, cukup dengan menghapus
include_package_data=True
.Setelah membaca di sini , saya menyadari bahwa ini
include_package_data
bertujuan untuk memasukkan file dari kontrol versi , bukan hanya "memasukkan data paket" seperti namanya. Dari dokumen:Membuang argumen itu untuk memperbaikinya, yang merupakan alasan mengapa argumen ini juga berfungsi ketika Anda beralih ke distutils, karena argumen itu tidak menerima argumen itu.
sumber
include_package_data=True
entri. Satu-satunya solusi bagi saya adalah menambahkan entri di Manifest seperti yang disarankan di atas. Pikiran Anda saya menggunakan setuptools, mungkin versi Anda berfungsi dengan 'mendistribusikan'?include_package_data
pemecahan masalah lebih lanjut dalam teks asli - Jika menggunakaninclude_package_data
argumen setuptools spesifik , file yang ditentukan olehpackage_data
tidak akan secara otomatis ditambahkan ke manifes kecuali mereka terdaftar dalamMANIFEST.in
file.package_data
mengatur ke daftar yang tidak kosong dan menentukaninclude_package_data=False
? Dan mengapa Anda perlu menentukan file dua kali dalamMANIFEST.in
danpackage_data
?Mengikuti rekomendasi @ Jo untuk menghapus
include_package_data=True
saluran juga bekerja untuk saya.Untuk sedikit lebih rumit, saya tidak punya
MANIFEST.in
file. Saya menggunakan Git dan bukan CVS.Repositori berbentuk seperti ini:
setup.py
:Saya menjalankan
python setup.py sdist
distrib sumber (belum mencoba biner).Dan ketika di dalam lingkungan virtual baru, saya punya
myproject-4.19.tar.gz
, file, dan saya gunakanDan selain semuanya yang diinstal ke lingkungan virtual saya
site-packages
, file data khusus itu diinstal ke/opt/local/myproject/data
dan/opt/local/myproject/etc
.sumber
include_package_data=True
bekerja untukku.Jika Anda menggunakan git, ingat untuk menyertakan
setuptools-git
diinstall_requires
. Jauh lebih tidak membosankan daripada memilikiManifest
atau memasukkan semua jalan masukpackage_data
(dalam kasus saya ini adalah aplikasi Django dengan semua jenis statika)(disisipkan komentar yang saya buat, seperti k3-rnc sebutkan itu sebenarnya membantu apa adanya)
sumber
Pembaruan : Jawaban ini sudah tua dan informasinya tidak lagi valid. Semua konfigurasi setup.py harus digunakan
import setuptools
. Saya telah menambahkan jawaban yang lebih lengkap di https://stackoverflow.com/a/49501350/64313Saya memecahkan masalah ini dengan beralih ke distutils. Sepertinya mendistribusikan sudah usang dan / atau rusak.
sumber
include_package_data=True
tidak dihormati. Jadi dengan pengaturan itu Anda hanya perlu MANIFEST.in - tidak perlu menduplikasi daftar file Anda dalampackage_data
pengaturan.Pertanyaan kuno namun ... manajemen paket python benar-benar menyisakan banyak yang diinginkan. Jadi saya punya kasus penggunaan menginstal menggunakan pip secara lokal ke direktori yang ditentukan dan terkejut kedua jalur package_data dan data_files tidak berhasil. Saya tidak tertarik untuk menambahkan file lain ke repo jadi saya akhirnya memanfaatkan data_files dan opsi setup.py - install-data; sesuatu seperti ini
sumber
Memindahkan folder yang berisi data paket ke folder modul memecahkan masalah bagi saya.
Lihat pertanyaan ini: MANIFEST.in diabaikan pada "python setup.py install" - tidak ada file data yang diinstal?
sumber
Saya memiliki masalah yang sama selama beberapa hari tetapi bahkan utas ini tidak dapat membantu saya karena semuanya membingungkan. Jadi saya melakukan riset dan menemukan solusi berikut:
Jawaban lengkap stackoverflow lainnya di sini
sumber
Hapus saja garis:
dari skrip pengaturan Anda, dan itu akan berfungsi dengan baik. (Diuji sekarang dengan alat setup terbaru.)
sumber
sdist
danbdist_wheel
, sudahkah Anda memeriksa alasannya?sdist
mengabaikanpackage_data
ketika ini diatur.Menggunakan setup.cfg (setuptools ≥ 30.3.0)
Dimulai dengan setuptools 30.3.0 (dirilis 2016-12-08), Anda dapat menjaga
setup.py
sangat kecil dan memindahkan konfigurasi kesetup.cfg
file. Dengan pendekatan ini, Anda bisa meletakkan data paket Anda di[options.package_data]
bagian:Dalam hal ini, Anda
setup.py
dapat sesingkat:Untuk informasi lebih lanjut, lihat mengkonfigurasi pengaturan menggunakan file setup.cfg .
Ada beberapa pembicaraan tentang penghentian
setup.cfg
mendukungpyproject.toml
seperti yang diusulkan dalam PEP 518 , tetapi ini masih bersifat sementara pada 2020-02-21.sumber
pip install
.pip install
, untuk versi pip yang cukup modern, pertama-tama akan membangun roda dan kemudian menginstalnya. Namun bagi banyak pengguna pendekatan ini diam-diam akan gagal memasukkan data paket. Lihat jawaban yang diterima dan komentar di bawahnya untuk perincian tentang itu. Menggunakan asetup.cfg
sebenarnya hanya cara penulisan yang berbeda dari apa yang sudah dilakukan OPsetup.py
dalam pertanyaan (dengan melewatkanpackage_data
argumen kata kunci dalam panggilan kesetup
), jadi saya tidak berpikir ini sangat membantu sebagai jawaban untuk pertanyaan ini . Itu sama sekali tidak mengatasi masalah mendasar.