pypi UserWarning: Opsi distribusi tidak diketahui: 'install_requires'

112

Apakah ada yang menemui peringatan ini saat menjalankan python setup.py installpaket PyPI?

install_requiresmendefinisikan apa yang dibutuhkan paket. Banyak paket PyPI memiliki opsi ini. Bagaimana ini bisa menjadi "opsi distribusi yang tidak diketahui"?

Tyler Long
sumber
@tripleee mungkin, tapi pertanyaan ini ditanyakan lebih awal dari yang itu.
Tyler Long
Usia pertanyaan adalah perhatian sekunder tetapi saya juga tidak memiliki pendapat yang kuat. Jika Anda ingin nominasi duplikat dibalik, mungkin buat pertanyaan Meta Stack Overflow untuk visibilitas. Bagi saya pribadi, jawaban pertanyaan lain yang diterima lebih membantu saya, karena lebih langsung dan fokus. Anda sepertinya tidak pernah menerima jawaban ini, jadi itu adalah faktor yang sebenarnya bisa Anda ubah.
tripleee
1
@tripleee jika Anda membaca utas ini dengan cermat, Anda akan menyadari bahwa tidak ada jawaban yang sempurna sama sekali. Jadi saya tidak tahu jawaban mana yang harus diterima. Saya tidak ingin menyesatkan orang dengan memilih jawaban yang bahkan tidak dapat meyakinkan diri saya sendiri.
Tyler Long

Jawaban:

89

python setup.pymenggunakan distutils yang tidak mendukung install_requires. setuptools melakukannya, juga mendistribusikan (penggantinya), dan pip (yang menggunakan keduanya) do. Tapi sebenarnya Anda harus menggunakannya. Yaitu panggilan setuptools melalui easy_installperintah atau pip install.

Cara lain adalah dengan mengimpor setup dari setuptools di setup.py Anda, tetapi ini tidak standar dan membuat semua orang yang ingin menggunakan paket Anda harus sudah menginstal setuptools.

Sebastian Blask
sumber
3
Katakanlah saya ingin menggunakan pip, lalu bagaimana cara menjalankan setup.pyfile jika saya hanya ingin membuat ekstensi di tempat?
Fred Foo
11
Peringatan tersebut tidak menghalangi Anda untuk mengemas kode Anda, sehingga Anda dapat menjalankan python setup.py sdistdan menginstalnya pip install resulting_package.tar.gz. Anda juga dapat menggunakan pip install -euntuk menginstal langsung dari sumber, tetapi saya selalu lebih suka menginstal dari paket atau dari repositori secara langsung ..
Sebastian Blask
Ini sedikit kacau. Anda selalu dapat mencoba mengimpor setup dari setuptools terlebih dahulu, jika tidak gunakan distutils dan dapatkan peringatannya. Namun, jika dalam pypy, Anda mungkin akan mendapatkan "Terlalu banyak file yang terbuka" karena alat penyiapan tidak menutup deskriptor dengan benar (bahkan di Debian, dengan ulimit default -n 1024): bugs.pypy.org/issue878
fiorix
1
Lihat jawaban saya - sejauh yang saya tahu, ini hanyalah bug langsung di alat setup. Pengguna tidak melakukan kesalahan apa pun, setuptools adalah.
ncoghlan
Ini secara tidak langsung menjawab pertanyaan saya: Saya mendapat kesalahan karena berlari pip install pendulum==1.4.4. Menjalankan pip install setuptools --upgrademenghapus kesalahan.
Buang Akun
32

Ini adalah hasil pertama pencarian google saya, tetapi tidak ada jawaban. Saya menemukan bahwa mengupgrade setuptools menyelesaikan masalah untuk saya (dan pip untuk tindakan yang baik)

pip install --upgrade pip
pip install --upgrade setuptools

Semoga ini membantu orang berikutnya untuk menemukan tautan ini!

Matt
sumber
Ini juga menyelesaikannya untuk saya. (Python 3.4, mencoba pip3 install neovim-remote.)
Michael Iles
Ini berhasil untuk saya. Mencoba menginstal mako di Python 2.7.16. Punya opsi Distribusi Tidak Dikenal serupa. Pip baik-baik saja tetapi alat penyiapan beralih ke 41.0.1 dari 40.6.2. Kemudian Mako menginstal A-OK.
Max Yaffe
18

PERHATIAN ! PERHATIAN ! Jawaban tidak sempurna di depan. Untuk mendapatkan "memo terbaru" tentang status pengemasan di dunia Python, baca esai yang cukup mendetail ini .

Saya baru saja mengalami masalah ini ketika mencoba membangun / menginstal yang memungkinkan. Masalahnya tampaknya distutils benar - benar tidak mendukung install_requires. Setuptools harus menambal monyet distutils dengan cepat, tetapi tidak, mungkin karena rilis terakhir setuptools adalah 0.6c11 dari 2009, sedangkan distutils adalah proyek inti Python.

Jadi, bahkan setelah menginstal setuptools-0.6c11-py2.7.egg secara manual, running setup.py hanya mengambil distutils dist.py, dan bukan yang dari site-packages / setuptools /.

Juga petunjuk dokumentasi setuptools untuk menggunakan ez_setup dan bukan distutils.

Akan tetapi, setuptools itu sendiri disediakan oleh distribusikan saat ini, dan jenis setup () itu mendukung install_requires.

PAStheLoD
sumber
1
Tidak disukai, karena jawaban ini mengandung beberapa disinformasi dan kebingungan tentang hal-hal yang berbeda. ez_setup.py, misalnya, adalah penginstal bootstrap untuk setuptools dan bukan sesuatu yang akan digunakan "alih-alih" distutils. Kebanyakan paket PyPI tidak "salah".
Iguananaut
1
@Iguananaut, terima kasih telah meninjau jawabannya; Saya sudah mengeditnya.
PAStheLoD
Oh keren, terima kasih. Saya akan memberi suara ulang dalam kasus itu :) Esai Nick Coghlan yang Anda tautkan adalah esai yang telah saya bagikan dengan rekan kerja saya sebelumnya untuk mencoba membuat mereka memahami hal ini.
Iguananaut
Esai bagus tentang keadaan di bulan Maret 2013. Satu pertanyaan ... Penulis menyatakan: "Proyek setuptoolsdan distributesedang dalam proses penggabungan kembali, tetapi penggabungan belum selesai (saya akan memperbarui esai ini segera setelah itu berubah). " Adakah yang tahu apa keadaan sejauh ini pada 2019? Dengan tanggal Akhir Masa Pakai Python 2.7 yang semakin dekat, banyak paket python akan dalam proses pembaruan & pengemasan ulang.
TrinitronX
16

Saya menggunakan Mac dengan python 2.7.11. Saya telah bermain-main dengan membuat proyek yang sangat sederhana dan mudah, di mana satu-satunya persyaratan saya adalah saya dapat menjalankan python setup.py install, dan telah setup.pymenggunakan perintah pengaturan, idealnya dari distutils. Secara harfiah tidak ada impor atau kode lain selain dari kwargs setup()selain yang saya catat di sini.

Saya mendapatkan kesalahan saat impor untuk setup.pyfile saya adalah:

from distutils.core import setup

Saat saya menggunakan ini, saya mendapatkan peringatan seperti

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Opsi distribusi tidak diketahui: 'entry_points' warnings.warn ( msg)

Jika saya mengubah impor (dan tidak ada yang lain ) ke yang berikut:

from distutils.core import setup
import setuptools  # noqa

Peringatan itu hilang.

Perhatikan bahwa saya tidak menggunakan setuptools, hanya dengan mengimpornya akan mengubah perilakunya sehingga tidak lagi mengeluarkan peringatan. Bagi saya, ini adalah penyebab perbedaan yang sangat membingungkan di mana beberapa proyek yang saya gunakan memberikan peringatan tersebut, dan beberapa lainnya tidak.

Jelas, beberapa bentuk tambalan monyet sedang terjadi, dan itu dipengaruhi oleh apakah impor itu dilakukan atau tidak. Ini mungkin bukan situasi untuk semua orang yang meneliti masalah ini, tetapi untuk lingkungan sempit tempat saya bekerja, inilah jawaban yang saya cari.


Ini konsisten dengan komentar (komunitas) lain, yang mengatakan bahwa distutils harus monkeypatch setuptools, dan bahwa mereka mengalami masalah saat menginstal Ansible. Ansible tampaknya mencoba mengizinkan penginstalan tanpa alat penyiapan di masa lalu, lalu kembali lagi.

https://github.com/ansible/ansible/blob/devel/setup.py

Banyak hal yang mengudara ... tetapi jika Anda mencari jawaban sederhana untuk proyek sederhana, Anda mungkin sebaiknya mengimpor alat setup.

AlanSE
sumber
1
Menambahkan import setuptoolsjuga secara ajaib menyelesaikan masalah bagi saya di ubuntu 16.04 dengan python 3.5.
kuropan
8

Ini adalah peringatan dari distutils, dan merupakan tanda bahwa Anda belum menginstal alat setup. Menginstalnya dari http://pypi.python.org/pypi/setuptools akan menghapus peringatan tersebut.

Fredrik Håård
sumber
32
setuptools diinstal. masih ada peringatannya.
Tyler Long
Anda benar, saya mendapatkan kesalahan ini di Python 2.6.6 bahkan jika setuptools atau distribusikan diinstal. Jika saya mencoba dengan 2.7.2 itu hilang.
Fredrik Hård
4
Saya mengalami masalah ini di python 2.7.3
Calvin Cheng
2
Ini berhasil untuk saya: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek
Terima kasih, @radtek, itu juga berhasil untuk saya. Mungkin Anda bisa membuat komentar Anda menjadi sebuah jawaban?
Esteis
4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Ini akan menginstal header yang hilang. Itu memecahkan masalah saya

Priyanshu Chauhan
sumber
4

Kesimpulannya :

distutilstidak mendukung install_requiresatau entry_points, setuptoolstidak.

ubah from distutils.core import setupdi setup.py ke from setuptools import setupatau refactor setup.py Anda untuk menggunakan distutilsfitur saja .

Saya datang ke sini karena saya tidak menyadari entry_pointsitu hanya setuptoolsfitur.

Jika Anda di sini ingin berubah setuptoolsmenjadi distutilsseperti saya:

  1. menghapus install_requiresdari setup.py dan hanya menggunakan requirements.txt denganpip
  2. ubah entry_pointske scripts( doc ) dan refactor semua modul yang mengandalkan entry_pointsmenjadi skrip lengkap dengan shebang dan titik masuk.
Karsten
sumber
Saya mencoba untuk memahami paket apa yang direkomendasikan. Anda menulis "hanya menggunakan fitur distutils" juga "mengubah alat setup ke distutils", tetapi juga menyatakan "entry_points hanyalah fitur setuptools", tampaknya sedikit kontradiktif?
chrisinmtown
2

Sejauh yang saya tahu, ini adalah bug di setuptools di mana ia tidak menghapus opsi khusus setuptools sebelum memanggil ke kelas dasar di perpustakaan standar: https://bitbucket.org/pypa/setuptools/issue/29 / hindari-userwarnings-emitted-when-calling

Jika Anda memiliki unconditional import setuptoolsdi Anda setup.py(seperti yang seharusnya Anda lakukan jika menggunakan opsi khusus setuptools), maka fakta bahwa skrip tidak gagal ImportErrormenunjukkan bahwa setuptools sudah diinstal dengan benar.

Anda dapat membungkam peringatan sebagai berikut:

python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>

Hanya melakukan hal ini jika Anda menggunakan impor tanpa syarat yang akan gagal sama sekali jika setuptools tidak terpasang :)

(Saya melihat perilaku yang sama ini di checkout dari repo setuptools pasca-merger, itulah sebabnya saya yakin ini adalah bug setuptools daripada masalah konfigurasi sistem. Saya berharap distribusi pra-penggabungan akan memiliki masalah yang sama)

ncoghlan.dll
sumber
0

Sekarang saya telah melihat ini di alat lama menggunakan Python2.7, di mana sebuah build (seperti Dockerfile) menginstal dependensi yang tidak disematkan, misalnya pytest. PyTest telah menghentikan dukungan Python 2.7, jadi Anda mungkin perlu menentukan versi <rilis paket baru.

Atau gigih peluru dan ubah aplikasi itu ke Python 3 jika itu memungkinkan.

Danny Staple
sumber