pypi UserWarning: ตัวเลือกการแจกจ่ายที่ไม่รู้จัก: 'install_requires'


113

มีใครพบคำเตือนนี้เมื่อpython setup.py installเรียกใช้แพ็คเกจ PyPI หรือไม่?

install_requiresกำหนดสิ่งที่แพคเกจต้องการ แพ็คเกจ PyPI จำนวนมากมีตัวเลือกนี้ "ตัวเลือกการแจกจ่ายที่ไม่รู้จัก" ได้อย่างไร



@tripleee อาจจะ แต่คำถามนี้ถูกถามเร็วกว่าคำถามนั้น
Tyler Long

อายุคำถามเป็นปัญหารองแต่ฉันไม่มีความคิดเห็นที่ชัดเจนทั้งสองอย่าง หากคุณต้องการให้การเสนอชื่อซ้ำไปในทางตรงกันข้ามอาจสร้างคำถามMeta Stack Overflowเพื่อให้มองเห็นได้ สำหรับฉันโดยส่วนตัวแล้วคำตอบที่ยอมรับของคำถามอื่นช่วยฉันได้มากกว่าเพราะตรงประเด็นและมีสมาธิมากกว่า ดูเหมือนคุณจะไม่เคยยอมรับคำตอบใด ๆ เหล่านี้นั่นจึงเป็นปัจจัยที่คุณสามารถเปลี่ยนแปลงได้
tripleee

1
@tripleee ถ้าคุณอ่านหัวข้อนี้อย่างละเอียดคุณจะรู้ว่าไม่มีคำตอบที่สมบูรณ์แบบเลย เลยไม่รู้จะตอบรับข้อไหนดี ฉันไม่อยากทำให้คนเข้าใจผิดโดยการเลือกคำตอบที่ไม่สามารถโน้มน้าวตัวเองได้
Tyler Long

คำตอบ:


89

python setup.pyใช้ distutils ที่ไม่รองรับ install_requires setuptools ยังแจกจ่าย (ตัวตายตัวแทน) และ pip ​​(ซึ่งใช้อย่างใดอย่างหนึ่ง) ทำ แต่คุณต้องใช้มันจริงๆ เช่นเรียก setuptools ผ่านeasy_installคำสั่งหรือpip install.

อีกวิธีหนึ่งคือการนำเข้าการตั้งค่าจาก setuptools ใน setup.py ของคุณ แต่นี่ไม่ใช่มาตรฐานและทำให้ทุกคนที่ต้องการใช้แพ็คเกจของคุณต้องติดตั้ง setuptools


3
สมมติว่าฉันต้องการใช้pipฉันจะเรียกใช้setup.pyไฟล์ได้อย่างไรหากฉันต้องการสร้างส่วนขยายในตำแหน่งเท่านั้น
Fred Foo

11
คำเตือนไม่ได้ป้องกันคุณจากการบรรจุภัณฑ์รหัสของคุณเพื่อให้คุณสามารถเรียกใช้และติดตั้งด้วยpython setup.py sdist pip install resulting_package.tar.gzคุณยังสามารถใช้pip install -eเพื่อติดตั้งโดยตรงจากแหล่งที่มา แต่ฉันมักจะชอบติดตั้งจากแพ็คเกจหรือจากที่เก็บโดยตรง ..
Sebastian Blask

นี่คือความสับสนเล็กน้อย คุณสามารถลองนำเข้าการตั้งค่าจาก setuptools ก่อนได้เสมอมิฉะนั้นให้ใช้สิ่งที่ผิดปกติและรับคำเตือน อย่างไรก็ตามหากเป็น pypy คุณอาจลงเอยด้วย "ไฟล์ที่เปิดมากเกินไป" เนื่องจาก setuptools ไม่ได้ปิดตัวอธิบายอย่างถูกต้อง (แม้ใน Debian ด้วยค่าเริ่มต้น ulimit -n 1024): bugs.pypy.org/issue878
fiorix

1
ดูคำตอบของฉัน - เท่าที่ฉันสามารถบอกได้นี่เป็นเพียงข้อผิดพลาดใน setuptools ผู้ใช้ไม่ได้ทำอะไรผิด setuptools คือ
ncoghlan

นี้ทางอ้อมตอบคำถามของฉัน: pip install pendulum==1.4.4ฉันมีข้อผิดพลาดเป็นผลมาจากการทำงานของ กำลังดำเนินการpip install setuptools --upgradeล้างข้อผิดพลาด
โยนทิ้งบัญชี

32

นี่เป็นผลลัพธ์แรกในการค้นหาโดย Google ของฉัน แต่ไม่มีคำตอบ ฉันพบว่าการอัปเกรด setuptools ช่วยแก้ปัญหาให้ฉันได้ (และ pip ​​สำหรับการวัดที่ดี)

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

หวังว่านี่จะช่วยให้คนต่อไปพบลิงค์นี้!


สิ่งนี้แก้ไขให้ฉันด้วย (Python 3.4 พยายามpip3 install neovim-remote)
Michael Iles

สิ่งนี้ได้ผลสำหรับฉัน กำลังพยายามติดตั้ง mako บน Python 2.7.16 มีตัวเลือกการแจกจ่ายที่ไม่รู้จักที่คล้ายกัน Pip ใช้ได้ แต่ setuptools ไปที่ 41.0.1 จาก 40.6.2 จากนั้น Mako ก็ติดตั้ง A-OK
Max Yaffe

18

ความสนใจ ! ความสนใจ ! คำตอบที่ไม่สมบูรณ์ข้างหน้า หากต้องการรับ "บันทึกล่าสุด" เกี่ยวกับสถานะของบรรจุภัณฑ์ในจักรวาล Python โปรดอ่านบทความที่มีรายละเอียดพอสมควรนี้

ฉันเพิ่งพบปัญหานี้เมื่อพยายามสร้าง / ติดตั้ง ansible ปัญหาน่าจะเป็นที่ distutils ไม่รองรับ install_requires จริงๆ Setuptools ควรใช้ Monkey-patch distutils ได้ทันที แต่ไม่เป็นเช่นนั้นอาจเป็นเพราะ setuptools รุ่นล่าสุดคือ 0.6c11 จากปี 2009 ในขณะที่ distutils เป็นโครงการหลักของ Python

ดังนั้นแม้หลังจากติดตั้ง setuptools-0.6c11-py2.7.egg ด้วยตนเองที่รัน setup.py จะเลือกเฉพาะ dist.py ที่ห่างไกลออกไปเท่านั้นไม่ใช่จาก site-package / setuptools /

นอกจากนี้เอกสารคู่มือ setuptools ยังให้คำแนะนำเกี่ยวกับการใช้ez_setupไม่ใช่สิ่งที่ไม่น่าสนใจ

อย่างไรก็ตาม setuptools นั้นมีให้โดยการแจกจ่ายในปัจจุบันและรสชาติของการตั้งค่า () นั้นรองรับ install_requires


1
ลงคะแนนเนื่องจากคำตอบนี้มีการบิดเบือนข้อมูลและความสับสนเกี่ยวกับสิ่งที่แตกต่างกัน ตัวอย่างเช่น ez_setup.py เป็นโปรแกรมติดตั้ง bootstrap สำหรับ setuptools และไม่ใช่สิ่งที่จะใช้ "แทน" distutils แพ็คเกจ PyPI ส่วนใหญ่ไม่ได้ "ผิดเพียง"
Iguananaut

1
@Iguananaut ขอบคุณสำหรับการตรวจสอบคำตอบ; ฉันแก้ไขมันแล้ว
PAStheLoD

โอ้เจ๋งขอบคุณ ฉันจะโหวตอีกครั้งในกรณีนั้น :) เรียงความของ Nick Coghlan ที่คุณเชื่อมโยงเป็นบทความที่ฉันเคยแบ่งปันกับเพื่อนร่วมงานของฉันก่อนหน้านี้เพื่อพยายามให้พวกเขาห่อหัวของพวกเขาในเรื่องนี้
Iguananaut

บทความยอดเยี่ยมเกี่ยวกับสถานะของสิ่งต่างๆในเดือนมีนาคม 2013 คำถามหนึ่ง ... ผู้เขียนระบุว่า: " setuptoolsและdistributeโครงการต่างๆอยู่ในระหว่างการรวมกลับเข้าด้วยกัน แต่การควบรวมกิจการยังไม่เสร็จสมบูรณ์ (ฉันจะอัปเดตบทความนี้ทันทีที่ ที่เปลี่ยนแปลง). " มีใครรู้บ้างว่าในปี 2019 จะเป็นอย่างไรบ้าง? เมื่อวันที่สิ้นสุดอายุการใช้งานของ Python 2.7 ใกล้เข้ามาอย่างรวดเร็วแพ็คเกจ Python จำนวนมากจะอยู่ระหว่างการอัปเดตและบรรจุใหม่
TrinitronX

16

ฉันใช้ Mac กับ python 2.7.11 ฉันเคยเล่นกับการสร้างโปรเจ็กต์ที่เรียบง่ายและตรงไปตรงมามากโดยที่ความต้องการเพียงอย่างเดียวของฉันคือฉันสามารถเรียกใช้python setup.py installและsetup.pyใช้คำสั่งการตั้งค่าได้อย่างดีเยี่ยม ไม่มีการนำเข้าหรือรหัสอื่น ๆ นอกเหนือจาก kwargs ไปยังsetup()สิ่งอื่นนอกเหนือจากที่ฉันทราบที่นี่

ฉันได้รับข้อผิดพลาดเมื่อนำเข้าsetup.pyไฟล์ของฉันคือ:

from distutils.core import setup

เมื่อฉันใช้สิ่งนี้ฉันจะได้รับคำเตือนเช่น

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: ตัวเลือกการแจกจ่ายที่ไม่รู้จัก: คำเตือน 'entry_points' คำเตือน ( ผงชูรส)

หากฉันเปลี่ยนการนำเข้า (และไม่มีอะไรอื่น ) เป็นดังต่อไปนี้:

from distutils.core import setup
import setuptools  # noqa

คำเตือนหายไป

โปรดทราบว่าฉันไม่ได้ใช้setuptoolsเพียงแค่การนำเข้ามันก็เปลี่ยนพฤติกรรมเพื่อไม่ให้ส่งเสียงเตือนอีกต่อไป สำหรับฉันนี่เป็นสาเหตุของความแตกต่างที่ทำให้งงงวยอย่างแท้จริงซึ่งบางโครงการที่ฉันใช้อยู่ให้คำเตือนเหล่านั้นและบางโครงการไม่ทำ

เห็นได้ชัดว่ารูปแบบการปะลิงบางรูปแบบกำลังเกิดขึ้นและได้รับผลกระทบจากการนำเข้าดังกล่าวหรือไม่ นี่อาจไม่ใช่สถานการณ์สำหรับทุกคนที่กำลังค้นคว้าปัญหานี้ แต่สำหรับสภาพแวดล้อมที่แคบซึ่งฉันกำลังทำงานอยู่นี่คือคำตอบที่ฉันกำลังมองหา


สิ่งนี้สอดคล้องกับความคิดเห็นอื่น ๆ (ชุมชน) ซึ่งกล่าวว่าสิ่งที่น่ารังเกียจควรเป็นชุดเครื่องมือ Monkeypatch และพวกเขามีปัญหาเมื่อติดตั้ง Ansible ดูเหมือนว่า Ansible จะพยายามอนุญาตให้ติดตั้งโดยไม่ต้องมี setuptools มาก่อนแล้วจึงย้อนกลับไป

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

มีหลายสิ่งหลายอย่างเกิดขึ้นในอากาศ ... แต่ถ้าคุณกำลังมองหาคำตอบง่ายๆสำหรับโปรเจ็กต์ง่ายๆคุณน่าจะแค่นำเข้า setuptools


1
การเพิ่มimport setuptoolsยังแก้ปัญหาให้ฉันได้อย่างน่าอัศจรรย์บน Ubuntu 16.04 ด้วย python 3.5
kuropan

8

นี่คือคำเตือนจากสิ่งที่ผิดปกติและเป็นสัญญาณว่าคุณไม่ได้ติดตั้ง setuptools การติดตั้งจากhttp://pypi.python.org/pypi/setuptoolsจะลบคำเตือน


32
ติดตั้ง setuptools แล้ว ยังคงมีคำเตือน
Tyler Long

คุณพูดถูกฉันได้รับข้อผิดพลาดนี้ใน Python 2.6.6 แม้ว่าจะติดตั้ง setuptools หรือ distribution ถ้าฉันลอง 2.7.2 มันหายไป
Fredrik Håård

4
ฉันมีปัญหานี้ใน python 2.7.3
Calvin Cheng

2
สิ่งนี้ทำเพื่อฉัน: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek

ขอบคุณ @radtek ที่ทำงานให้ฉันด้วย บางทีคุณอาจแสดงความคิดเห็นเป็นคำตอบ?
Esteis

4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

มันจะติดตั้งส่วนหัวที่ขาดหายไป มันช่วยแก้ปัญหาของฉันได้


4

สรุป :

distutilsไม่สนับสนุนinstall_requiresหรือentry_points, setuptoolsไม่

การเปลี่ยนแปลงfrom distutils.core import setupในsetup.pyไปfrom setuptools import setupหรือ refactor ของคุณsetup.pyจะใช้เพียงdistutilsมี

ฉันมาที่นี่เพราะฉันไม่รู้ว่าentry_pointsเป็นเพียงsetuptoolsคุณสมบัติเท่านั้น

หากคุณอยู่ที่นี่ต้องการเปลี่ยนsetuptoolsเป็นdistutilsชอบฉัน:

  1. ลบออกinstall_requiresจากsetup.pyและใช้requirements.txtกับpip
  2. เปลี่ยนentry_pointsเป็นscripts( doc ) และปรับโครงสร้างโมดูลใด ๆ ที่อาศัยentry_pointsเป็นสคริปต์แบบเต็มโดยใช้ shebangs และจุดเริ่มต้น

ฉันพยายามทำความเข้าใจว่าแพ็คเกจที่แนะนำคืออะไร คุณเขียนว่า "use only distutils features" และ "convert setuptools to distutils" แต่ยังระบุว่า "entry_points เป็นเพียงคุณลักษณะ setuptools" ดูเหมือนจะขัดแย้งกันเล็กน้อย?
chrisinmtown

2

เท่าที่ฉันสามารถบอกได้นี่เป็นข้อบกพร่องใน setuptools ที่ไม่ได้ลบตัวเลือกเฉพาะ setuptools ออกก่อนที่จะเรียกขึ้นไปยังคลาสพื้นฐานในไลบรารีมาตรฐาน: https://bitbucket.org/pypa/setuptools/issue/29 / หลีกเลี่ยงการเตือนผู้ใช้ที่ปล่อยออกมาเมื่อโทร

หากคุณมีอย่างไม่มีเงื่อนไขimport setuptoolsในของคุณsetup.py(ตามที่คุณควรถ้าใช้ setuptools ตัวเลือกที่เฉพาะเจาะจง) แล้วความจริงที่สคริปต์ไม่ได้ล้มเหลวกับการImportErrorแสดงให้เห็นว่า setuptools มีการติดตั้งอย่างถูกต้อง

คุณสามารถปิดเสียงเตือนได้ดังนี้:

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

ทำสิ่งนี้เฉพาะเมื่อคุณใช้การนำเข้าที่ไม่มีเงื่อนไขซึ่งจะล้มเหลวอย่างสมบูรณ์หากไม่ได้ติดตั้ง setuptools :)

(ฉันเห็นพฤติกรรมเดียวกันนี้ในการชำระเงินจาก repo setuptools หลังการควบรวมกิจการซึ่งเป็นเหตุผลว่าทำไมฉันถึงมั่นใจว่าเป็นบั๊ก setuptools มากกว่าปัญหาการกำหนดค่าระบบฉันคาดว่าการแจกจ่ายก่อนการรวมจะมีปัญหาเดียวกัน)


0

ตอนนี้ฉันได้เห็นสิ่งนี้ในเครื่องมือดั้งเดิมโดยใช้ Python2.7 ซึ่งบิลด์ (เช่น Dockerfile) ติดตั้งการพึ่งพาที่ไม่ได้ตรึงตัวอย่างเช่น pytest PyTest ได้ยกเลิกการรองรับ Python 2.7 ดังนั้นคุณอาจต้องระบุเวอร์ชัน <การเปิดตัวแพ็กเกจใหม่

หรือกัดกระสุนและแปลงแอพนั้นเป็น Python 3 หากเป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.