pypi Người dùng Cảnh báo: Tùy chọn phân phối không xác định: 'install_requires'


112

Có ai gặp cảnh báo này khi thực thi python setup.py installgói PyPI không?

install_requiresxác định những gì gói yêu cầu. Rất nhiều gói PyPI có tùy chọn này. Làm thế nào nó có thể là một "tùy chọn phân phối không xác định"?



@tripleee có thể, nhưng câu hỏi này đã được hỏi sớm hơn câu hỏi đó.
Tyler Long

Tuổi câu hỏi là một mối quan tâm thứ yếu nhưng tôi không có quan điểm mạnh mẽ. Nếu bạn muốn đề cử trùng lặp đi ngược lại, có thể tạo câu hỏi Meta Stack Overflow để hiển thị. Đối với cá nhân tôi, câu trả lời được chấp nhận của câu hỏi kia đã giúp tôi nhiều hơn, vì nó trực tiếp và tập trung hơn. Bạn dường như chưa bao giờ chấp nhận bất kỳ câu trả lời nào trong số này, vì vậy đó là một yếu tố bạn thực sự có thể thay đổi.
tripleee

1
@tripleee nếu bạn đọc kỹ chủ đề này, bạn sẽ nhận ra rằng không có câu trả lời hoàn hảo nào cả. Nên tôi không biết phải chấp nhận câu trả lời nào. Tôi không muốn đánh lừa mọi người bằng cách chọn một câu trả lời thậm chí không thể thuyết phục bản thân.
Tyler Long

Câu trả lời:


89

python setup.pysử dụng các bản phân phối không hỗ trợ install_requires. setuptools cũng phân phối (kế nhiệm của nó) và pip (sử dụng một trong hai). Nhưng bạn thực sự phải sử dụng chúng. Tức là gọi setuptools thông qua easy_installlệnh hoặc pip install.

Một cách khác là nhập thiết lập từ setuptools trong setup.py của bạn, nhưng điều này không chuẩn và khiến mọi người muốn sử dụng gói của bạn phải cài đặt setuptools.


3
Giả sử tôi muốn sử dụng pip, sau đó làm cách nào để chạy setup.pytệp nếu tôi chỉ muốn tạo tiện ích mở rộng tại chỗ?
Fred Foo

11
Cảnh báo không ngăn bạn đóng gói mã của mình, vì vậy bạn có thể chạy python setup.py sdistvà cài đặt nó với pip install resulting_package.tar.gz. Bạn cũng có thể sử dụng pip install -eđể cài đặt trực tiếp từ nguồn, nhưng tôi luôn ưu tiên cài đặt từ gói hoặc từ kho lưu trữ trực tiếp ..
Sebastian Blask

Đây là một chút lộn xộn. Bạn luôn có thể thử nhập thiết lập từ setuptools trước, nếu không, hãy sử dụng các bản phân phối và nhận được cảnh báo. Tuy nhiên, nếu nó ở trong pypy, bạn có thể gặp phải "Quá nhiều tệp đang mở" do các công cụ thiết lập không đóng bộ mô tả đúng cách (ngay cả trên Debian, với ulimit -n mặc định là 1024): bug.pypy.org/issue878
fiorix

1
Hãy xem câu trả lời của tôi - theo như tôi có thể nói, đây chỉ là một lỗi trong các công cụ thiết lập. Người dùng không làm gì sai, setuptools là như vậy.
ncoghlan

Điều này gián tiếp trả lời câu hỏi của tôi: Tôi đã gặp lỗi do chạy pip install pendulum==1.4.4. Đang chạy pip install setuptools --upgradeđã xóa lỗi.
Ném tài khoản vào

32

Đây là kết quả đầu tiên trên google tìm kiếm của tôi, nhưng không có câu trả lời. Tôi thấy rằng việc nâng cấp các công cụ thiết lập đã giải quyết được vấn đề cho tôi (và pip là biện pháp tốt)

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

Hy vọng điều này sẽ giúp những người tiếp theo tìm thấy liên kết này!


Điều này cũng giải quyết nó cho tôi. (Python 3.4, đang cố gắng pip3 install neovim-remote.)
Michael Iles

Điều này đã làm việc cho tôi. Đang cố gắng cài đặt mako trên Python 2.7.16. Có tùy chọn Phân phối Không xác định tương tự. Pip vẫn ổn nhưng setuptools đã chuyển sang 41.0.1 từ 40.6.2. Sau đó Mako đã cài đặt A-OK.
Max Yaffe

18

CHÚ Ý ! CHÚ Ý ! Câu trả lời không hoàn hảo ở phía trước. Để có được "bản ghi nhớ mới nhất" về trạng thái đóng gói trong vũ trụ Python, hãy đọc bài luận khá chi tiết này .

Tôi vừa gặp sự cố này khi cố gắng xây dựng / cài đặt ansible. Vấn đề dường như là bản phân phối thực sự không hỗ trợ install_requires. Setuptools nên nhanh chóng vá các distutils, nhưng điều đó không xảy ra, có thể là do bản phát hành cuối cùng của setuptools là 0.6c11 từ năm 2009, trong khi distutils là một dự án Python cốt lõi.

Vì vậy, ngay cả sau khi cài đặt thủ công setuptools-0.6c11-py2.7.egg đang chạy setup.py chỉ chọn distutils dist.py, chứ không phải từ site-package / setuptools /.

Ngoài ra, tài liệu setuptools cũng gợi ý cách sử dụng ez_setup chứ không phải distutils.

Tuy nhiên, bản thân setuptools được cung cấp bởi phân phối ngày nay và hương vị của setup () hỗ trợ install_requires.


1
Bị phản đối, vì câu trả lời này chứa một số thông tin sai lệch và gây nhầm lẫn về những thứ khác nhau là gì. ez_setup.py, ví dụ, là một trình cài đặt bootstrap cho các công cụ thiết lập và không phải là thứ mà người ta sẽ sử dụng các bản phân phối "thay vì". Hầu hết các gói PyPI không "đơn giản là sai".
Iguananaut

1
@Iguananaut, cảm ơn bạn đã xem lại câu trả lời; Tôi đã chỉnh sửa nó.
PAStheLoD

Ồ, cảm ơn. Tôi sẽ re-upvote trong trường hợp đó :) Bài luận của Nick Coghlan mà bạn đã liên kết là một bài luận mà tôi đã chia sẻ với đồng nghiệp của mình trước đây để cố gắng khiến họ chú ý đến vấn đề này.
Iguananaut

Bài văn hay về hiện trạng của mọi thứ vào tháng 3 năm 2013. Một câu hỏi ... Tác giả cho biết: "Các dự án setuptoolsdistributedự án đang trong quá trình hợp nhất trở lại với nhau, nhưng việc hợp nhất vẫn chưa hoàn thành (Tôi sẽ cập nhật bài luận này ngay khi thay đổi). " Có ai biết tình trạng của mọi thứ cho đến nay là gì vào năm 2019 không? Với ngày End of Life của Python 2.7 đang nhanh chóng đến gần, rất nhiều gói python sẽ đang trong quá trình cập nhật và đóng gói lại.
TrinitronX

16

Tôi đang sử dụng máy Mac với python 2.7.11. Tôi đã thử thách với việc tạo ra các dự án cực kỳ đơn giản và dễ hiểu, trong đó yêu cầu duy nhất của tôi là tôi có thể chạy python setup.py installsetup.pysử dụng lệnh thiết lập, lý tưởng là từ các bản phân phối. Thực sự không có nhập khẩu hoặc mã nào khác ngoài kwargs setup()ngoài những gì tôi lưu ý ở đây.

Tôi gặp lỗi khi nhập cho setup.pytệp của mình là:

from distutils.core import setup

Khi tôi sử dụng điều này, tôi nhận được các cảnh báo như

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Tùy chọn phân phối không xác định: 'entry_points' warning.warn ( tin nhắn)

Nếu tôi thay đổi các mục nhập (và không có gì khác ) thành như sau:

from distutils.core import setup
import setuptools  # noqa

Các cảnh báo biến mất.

Lưu ý rằng tôi không sử dụng setuptools, chỉ cần nhập nó sẽ thay đổi hành vi để nó không còn phát ra cảnh báo nữa. Đối với tôi, đây là nguyên nhân của sự khác biệt thực sự khó hiểu khi một số dự án tôi đang sử dụng đưa ra những cảnh báo đó, còn một số dự án khác thì không.

Rõ ràng, một số hình thức vá lỗi đang diễn ra và nó bị ảnh hưởng bởi việc nhập khẩu đó có được thực hiện hay không. Đây có lẽ không phải là tình huống cho tất cả mọi người nghiên cứu vấn đề này, nhưng đối với môi trường chật hẹp mà tôi đang làm việc, đây là câu trả lời mà tôi đang tìm kiếm.


Điều này phù hợp với nhận xét khác (cộng đồng), nói rằng các bản phân phối nên hỗ trợ thiết lập các công cụ cài đặt khỉ và họ đã gặp sự cố khi cài đặt Ansible. Ansible dường như đã cố gắng cho phép cài đặt mà không cần cài đặt công cụ trong quá khứ và sau đó quay lại điều đó.

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

Rất nhiều thứ đang được phát hành ... nhưng nếu bạn đang tìm kiếm câu trả lời đơn giản cho một dự án đơn giản, có lẽ bạn chỉ nên nhập các công cụ thiết lập.


1
Thêm import setuptoolscũng giải quyết vấn đề một cách thần kỳ cho tôi trên ubuntu 16.04 với python 3.5.
kuropan

8

Đây là cảnh báo từ các bản phân phối và là dấu hiệu cho thấy bạn chưa cài đặt các công cụ thiết lập. Cài đặt nó từ http://pypi.python.org/pypi/setuptools sẽ loại bỏ cảnh báo.


32
setuptools được cài đặt. vẫn có cảnh báo.
Tyler Long

Bạn nói khá đúng, tôi gặp lỗi này trong Python 2.6.6 ngay cả khi setuptools hoặc phân phối được cài đặt. Nếu tôi thử với 2.7.2 thì nó đã biến mất.
Fredrik Håård

4
Tôi đang gặp sự cố này trong python 2.7.3
Calvin Cheng

2
Điều này đã làm điều đó cho tôi: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek

Cảm ơn bạn, @radtek, điều đó cũng hiệu quả với tôi. Có lẽ bạn có thể làm cho nhận xét của bạn thành một câu trả lời?
Esteis

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

Nó sẽ cài đặt bất kỳ tiêu đề nào bị thiếu. Nó đã giải quyết vấn đề của tôi


4

Kết luận :

distutilskhông hỗ trợ install_requireshoặc entry_points, setuptoolskhông.

thay đổi from distutils.core import setuptrong setup.py thành from setuptools import setuphoặc cấu trúc lại setup.py của bạn để chỉ sử dụng distutilscác tính năng.

Tôi đến đây bởi vì tôi không nhận ra entry_pointsđó chỉ là một setuptoolstính năng.

Nếu bạn đang ở đây muốn chuyển đổi setuptoolsđể distutilsthích tôi:

  1. loại bỏ install_requirestừ setup.py và chỉ sử dụng requirements.txt vớipip
  2. thay đổi entry_pointsthành scripts( doc ) và cấu trúc lại bất kỳ mô-đun nào dựa vào entry_pointsđể trở thành các tập lệnh đầy đủ với shebangs và một điểm vào.

Tôi đang cố gắng hiểu gói được khuyến nghị là gì. Bạn viết "chỉ sử dụng tính năng của distutils" còn "convert setuptools thành distutils", mà còn ghi "entry_points chỉ là tính năng của setuptools", có vẻ hơi mâu thuẫn?
chrisinmtown

2

Theo như tôi có thể nói, đây là một lỗi trong setuptools, nơi nó không loại bỏ các tùy chọn cụ thể của setuptools trước khi gọi lên lớp cơ sở trong thư viện chuẩn: https://bitbucket.org/pypa/setuptools/issue/29 / tránh-cảnh báo người dùng-phát-ra-khi-gọi

Nếu bạn có một điều kiện vô điều kiện import setuptoolstrong của bạn setup.py(như bạn nên làm nếu sử dụng các tùy chọn cụ thể của setuptools), thì thực tế là tập lệnh không bị lỗi ImportErrorchỉ ra rằng setuptools đã được cài đặt đúng cách.

Bạn có thể tắt tiếng cảnh báo như sau:

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

Chỉ làm điều này nếu bạn sử dụng nhập vô điều kiện sẽ thất bại hoàn toàn nếu công cụ thiết lập không được cài đặt :)

(Tôi thấy hành vi tương tự này trong một thanh toán từ kho công cụ thiết lập sau hợp nhất, đó là lý do tại sao tôi tự tin rằng đó là lỗi thiết lập công nghệ thay vì vấn đề cấu hình hệ thống. Tôi hy vọng bản phân phối trước hợp nhất sẽ gặp vấn đề tương tự)


0

Bây giờ tôi đã thấy điều này trong các công cụ kế thừa sử dụng Python2.7, trong đó một bản dựng (như Dockerfile) cài đặt phần phụ thuộc không được ghim, ví dụ như pytest. PyTest đã bỏ hỗ trợ Python 2.7, vì vậy bạn có thể cần chỉ định phiên bản <bản phát hành gói mới.

Hoặc cắn viên đạn và chuyển đổi ứng dụng đó sang Python 3 nếu điều đó khả thi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.