Python PIP Install throws TypeError: (các) loại toán hạng không được hỗ trợ cho - =: 'Thử lại' và 'int'


106

Sử dụng pip installcho bất kỳ mô-đun nào rõ ràng trên hệ thống Ubuntu 16.04 của tôi với python 2.7.11+ sẽ xảy ra lỗi này:

TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

Có gì sai với pip? Làm cách nào để tôi có thể cài đặt lại nó, nếu cần?

Cập nhật: Theo dõi đầy đủ ở bên dưới

sunny@sunny:~$ pip install requests
Collecting requests
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 328, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 748, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 360, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 512, in _prepare_file
    finder, self.upgrade, require_hashes)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_install.py", line 273, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 442, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 400, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 545, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 648, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 757, in get_page
    "Cache-Control": "max-age=600",
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 480, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/download.py", line 378, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "/usr/share/python-wheels/CacheControl-0.11.5-py2.py3-none-any.whl/cachecontrol/adapter.py", line 46, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/adapters.py", line 376, in send
    timeout=timeout
  File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 610, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 228, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

@MartijnPieters Chắc chắn, bổ sung thông tin đó
devautor

Vậy những bánh xe đó đến từ đâu? pipthông thường sẽ sử dụng một requestsgói nhúng và requeststhông thường sẽ sử dụng một urllib3gói nhúng . Những bánh xe đó không phải là phiên bản nhúng và có thể không tương thích với piplớp con của một số mã này. di chuyển /usr/share/python-wheelssang một bên có lẽ?
Martijn Pieters

Tôi muốn pipsử dụng pip/_vendor/requests/pip/_vendor/requests/packages/urllib3/, không /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestshoặc /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters

Tôi hoàn toàn không biết về điều này! Tôi nên tìm kiếm thông tin về điều này ở đâu, hoặc tôi có thể làm gì?
devautor

Xin lỗi, không có câu trả lời dễ dàng ở đây; chỉ đang cố gắng chẩn đoán sự cố của bạn. Việc truy ngược là bất ngờ và chỉ ra một cuộc đụng độ giữa các phiên bản. Đó là lý do tại sao thường requestspipnhúng các phụ thuộc của chúng. Theo dõi của bạn cho thấy bất kỳ phiên bản nhúng nào không được sử dụng, nhưng tại sao đó là lý do tôi không biết.
Martijn Pieters

Câu trả lời:


86

Ubuntu đi kèm với một phiên bản PIP từ preambrian và đó là cách bạn phải nâng cấp nó nếu bạn không muốn mất hàng giờ đồng hồ để gỡ lỗi các vấn đề liên quan đến pip.

apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py

Như bạn đã quan sát, tôi đã bao gồm thông tin cho cả Python 2.x và 3.x


2
Thực hiện python get-pip.py không thành công với "OSError: [Errno 13] Quyền bị từ chối: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor

2
@mirror, sử dụng sudo vì get-pip.py sẽ cố gắng để cài đặt pip
Raghuram Vadapalli

45
Vấn đề này không liên quan gì đến pip. dấu vết ngăn xếp cho thấy yêu cầu lấy gói không thành công, cho thấy sự cố mạng. Yêu cầu OP cài đặt lại pip sẽ chỉ là một đường vòng.
Thom

2
đây là câu trả lời đúng, thủ phạm là vá kinh điển của pipđã vẫn chưa được định hình trong vài phiên bản bây giờ: github.com/pypa/pip/issues/4779
lurscher

2
Đã sử dụng nó trên raspberian. Không thể chạy "pip" nữa. Chỉ có thể chạy pip3. Tôi đã phải thêm một liên kết tượng trưng: ln -s / usr / local / bin / pip / usr / bin / pip được lấy (và sửa đổi) từ câu trả lời này: stackoverflow.com/questions/29712519/…
TheTrowser

36

Nếu bạn đang sử dụng proxy, bạn phải thực hiện thêm một số bước cấu hình trước khi bắt đầu cài đặt. Bạn phải đặt biến môi trường http_proxy thành địa chỉ proxy. Sử dụng bash, điều này được thực hiện bằng lệnh

export http_proxy="http://user:pass@my.site:port/" 

Bạn cũng có thể cung cấp

--proxy=[user:pass@]url:port 

tham số cho pip. Các [user:pass@]phần là không bắt buộc.


24

Việc cập nhật setuptools đã hoạt động tốt đối với tôi.

sudo pip install --upgrade setuptools

Làm việc cho tôi quá. Trên thực tế, sau khi thực hiện việc này, tôi nhận ra rằng các lỗi thường xuất hiện sau: Thu thập các công cụ thiết lập (từ kiwisolver> = 1.0.1-> matplotlib)
mayid

3
Điều này cũng làm việc cho tôi trên Raspian Stretch. Hãy chấp nhận câu trả lời này để làm cho nó dễ dàng hơn để tìm thấy
Sam Hammamy

cần khởi động lại sau đó để nướng cho nó hoạt động với raspbian
Pipo

4
Lệnh này gây ra cùng một lỗi TypeError cho tôi trên Debian9. Đây không phải là giải pháp phổ quát.
sir__finley

15

Trước hết, sự cố này tồn tại do sự cố mạng và việc gỡ cài đặt và cài đặt lại mọi thứ sẽ không giúp ích được nhiều. Có thể bạn đang sử dụng proxy và trong trường hợp đó bạn cần đặt proxy.

Nhưng trong trường hợp của tôi, tôi đang đối mặt với vấn đề vì tôi không đứng sau proxy. Nói chung, tôi làm việc đằng sau proxy, nhưng khi làm việc tại nhà, tôi đặt proxy thành Không có trong Cài đặt mạng.

Nhưng tôi vẫn gặp các lỗi tương tự ngay cả khi đã xóa cài đặt proxy.

Vì vậy, khi tôi nhập

env | grep proxy

Tôi tìm thấy một cái gì đó như thế này:

http_proxy=http://127.0.0.1:1234/

Và đây là lý do tôi vẫn gặp lỗi tương tự, ngay cả khi tôi nghĩ rằng tôi đã xóa cài đặt proxy.

Để bỏ đặt proxy này, hãy nhập

unset http_proxy

Thực hiện theo cùng một cách tiếp cận cho tất cả các mục nhập khác, chẳng hạn như https_proxy.


14

Điều xảy ra ở đây là các phiên bản được cung cấp của request / urllib3 xung đột khi được nhập ở hai nơi khác nhau (cùng mã, nhưng tên khác nhau). Nếu sau đó bạn gặp lỗi mạng, nó không thử lại để lấy bánh xe nhưng không thành công với lỗi trên. Xem tại đây để tìm hiểu sâu hơn về lỗi này.

Đối với giải pháp với pip hệ thống, xem ở trên .

Nếu bạn gặp sự cố này trong một virtualenv được xây dựng python -m venv(vẫn sao chép các bánh xe từ đó /usr/share/python-wheels, ngay cả khi bạn đã cài đặt riêng pip), thì cách dễ nhất để "khắc phục" nó có vẻ là:

  1. tạo virtualenv: /usr/bin/python3.6 -m venv ...
  2. cài đặt requestsvào môi trường (điều này có thể gây ra lỗi ở trên):<venv>/bin/pip install requests
  3. loại bỏ các phiên bản đã sao chép requestssẽ được sử dụng bởi pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Bây giờ a <venv>/bin/pipsử dụng phiên bản đã cài đặt requestsmà urllib3 cung cấp.


Cảm ơn, tôi vừa xóa cái này /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whlvà nó đã được sửa ngay bây giờ (không có virtualenv).
krsoni

Thực ra trong trường hợp của tôi, tôi không sử dụng env ảo.
krsoni

Nếu bạn xóa các tệp whl trực tiếp trong /usr/share/python-wheels, python -m venvsẽ không tạo được tệp có thể sử dụng được <venv>/bin/pip nữa. Vì vậy, nếu bạn xóa các tệp này, bạn nên chắc chắn rằng bạn không cần nó. Nếu bạn cần cả pip hệ thống và pip venv, bạn cần cài đặt hệ thống với get-pip.py(Xem stackoverflow.com/a/37531821/1380673 ) và bạn cần xóa các tệp whl trong mỗi venv.
Jan Katins

7

cổng 443 không mở, chỉ cho phép cổng tcp 443 tùy chỉnh nếu trên AWS khác mở cổng 443 cho các kết nối đi ...


Điều này đã giúp tôi rất nhiều thời gian trong cụm OpenStack của mình !! Good one Deepak!
Arun Das

5

Chỉ cần nâng cấp pip phù hợp với tôi:

pip install --upgrade pip


5
các lỗi xảy ra với tôi trong khi chạy lệnh này rất chính xác :(
allan.simon

Nó đã sửa lỗi cho tôi trên Raspbian Sketch Lite.
Raúl Salinas-Monteagudo

1
Tôi cũng đang chạy Raspian Stretch Lite và nó không khắc phục được lỗi.
Stefan Wegener

Tôi tán này làm việc thật đẹp "python -m pip cài đặt --upgrade pip"
imbatman

2

Tôi gặp vấn đề tương tự khi cài đặt RaspberryPI TFT từ Adafruit với pitft.sh / adafruit-pitft.sh .

Tôi không hài lòng về các kiểu mã hóa có lỗi từ đâu đó sẽ được giải thích bằng cách nào đó - như những câu trả lời trước có thể thấy.

Ghi chú: Loại lỗi ngoại lệ của retry.py rõ ràng là một lỗi, gây ra bởi sự gán và tính toán không phù hợp của một thể hiện của lớp Trả lời một int có giá trị mặc định là 10 - ở đâu đó trong mã ... Nên được sửa bằng cách thêm toán tử tại chỗ hoặc sửa bài tập bị sai.

Vì vậy, đã cố gắng phân tích và tự vá lỗi trước. Lỗi thực tế trong trường hợp của tôi cũng giống như vậy - retry.py được gọi bằng pip .

Tập lệnh cài đặt adafruit-pitft.sh / pitft.sh cố gắng áp dụng urllib3 mà bản thân nó cố gắng cài đặt các phần phụ thuộc lồng nhau bằng pip , do đó cùng một lỗi.

adafruit-pitft.sh # hoặc pitft.sh

...

_stacktrace = sys.exc_info () [2]) Tệp "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / use / retry.py", dòng 228, trong tăng

tổng - = 1

TypeError: (các) loại toán hạng không được hỗ trợ cho - =: 'Thử lại' và 'int'

Đối với bản phân phối hiện tại (dựa trên debian-9.6.0 / stretch):

Tệp "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", dòng 315, tăng dần

tổng - = 1

TypeError: (các) loại toán hạng không được hỗ trợ cho - =: 'Thử lại' và 'int'

Sau đây - bản vá lỗi * :) - cho phép một dấu vết lỗi phát ra âm thanh:

# File: retry.py - in *def increment(self, ..* about line 315
# original: total = self.total

# patch: quick-and-dirty-fix
# START:
if isinstance(self.total, Retry):
    self.total = self.total.total

if type(self.total) is not int:
    self.total = 2 # default is 10
# END:

# continue with original:
total = self.total

if total is not None:
    total -= 1

connect = self.connect
read = self.read
redirect = self.redirect
cause = 'unknown'
status = None
redirect_location = None

if error and self._is_connection_error(error):
    # Connect retry?
    if connect is False:
        raise six.reraise(type(error), error, _stacktrace)
    elif connect is not None:
        connect -= 1

Đầu ra âm thanh với bản vá tạm thời là (hiển thị hai lần ...?):

Đang thử lại (Thử lại (tổng = 1, kết nối = Không có, đọc = Không có, chuyển hướng = Không)) sau khi kết nối bị hỏng bởi 'ConnectTimeoutError (đối tượng <request.packages.urllib3.connection.VerifiedHTTPSConnection tại /

Đang thử lại (Thử lại (tổng = 0, kết nối = Không có, đọc = Không có, chuyển hướng = Không có)) sau khi kết nối bị hỏng bởi 'ConnectTimeoutError (đối tượng <request.packages.urllib3.connection.VerifiedHTTPSConnection tại /

Không thể tìm thấy phiên bản đáp ứng yêu cầu evdev (từ các phiên bản:)

Không tìm thấy phân phối phù hợp cho evdev

CẢNH BÁO: Pip không cài đặt được phần mềm!

Vì vậy, trong trường hợp của tôi thực sự có hai điều gây ra lỗi, điều này có thể khác nhau trong các môi trường khác:

  1. Thiếu evdev => cố gắng cài đặt
  2. Không kết nối được repo / dist chứa evdev để tải xuống. => cuối cùng từ bỏ nó

Môi trường cài đặt của tôi ngoại tuyến từ máy nhân bản debian + raspbian bên trong, do đó tôi không muốn đặt proxy ...

Vì vậy, tôi đã tiến hành cài đặt thủ công thành phần bị thiếu evdev :

  1. tải xuống evdev từ PyPI (hoặc ví dụ: từ github.com):

    https://pypi.org/project/evdev/

    https://files.pythonhosted.org/packages/7e/53/374b82dd2ccec240b7388c65075391147524255466651a14340615aabb5f/evdev-1.1.2.tar.gz

  2. Giải nén và cài đặt theo cách thủ công với tư cách người dùng root - đối với tất cả các tài khoản cục bộ, được phát hiện là đã cài đặt:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    python setup.py cài đặt

  3. Gọi lại tập lệnh cài đặt:

    adafruit-pitft.sh # hoặc pitft.sh

    ... Trả lời hội thoại ...

    ...đó là nó.

Nếu bạn tiếp tục trực tuyến bằng cách truy cập trực tiếp vào PyPI :

  1. kiểm tra định tuyến + tường lửa của bạn để truy cập pypi.org

  2. đặt proxy nếu được yêu cầu (http_proxy / https_proxy)

Và nó hoạt động..

Hy vọng điều này cũng giúp ích trong các trường hợp khác.

Arno-Can Uestuensoez

----------------------------------------------

Xem thêm: issue - 35334: https://bugs.python.org/issue35334

----------------------------------------------

Xem thêm: issue - 1486: https://github.com/urllib3/urllib3/issues/1486

cho tệp: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py


2

kiểm tra các sự cố mạng, để bỏ qua mã trường hợp ngoại lệ

Trong trường hợp của tôi, tôi đang sử dụng chỉ mục tùy chỉnh, chỉ mục đó không có đường dẫn và điều đó sẽ kích hoạt mã trường hợp ngoại lệ. Lỗi trường hợp ngoại lệ vẫn tồn tại và vẫn che dấu sự cố thực sự, tuy nhiên, tôi đã có thể khắc phục sự cố này bằng cách kiểm tra kết nối với các công cụ khác như nc -vzw1 myindex.example.org 443và thử lại khi mạng hoạt động.


1

Tôi đã gặp phải sự cố tương tự khi cố gắng cài đặt công cụ awscli trên phiên bản ec2. Tôi đã thay đổi nhóm bảo mật để cho phép cổng 443 truy cập vào và ra và điều đó đã giải quyết được vấn đề cho tôi.


Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào ; thay vào đó, cung cấp câu trả lời không yêu cầu người hỏi làm rõ . - Từ đánh giá
Lukas Körfer

1
Bây giờ nó trông đẹp hơn? Tôi chỉ nghĩ rằng tôi nên đề cập đến những gì tôi thấy hữu ích
Yogesh Gupta

1

Tôi gặp lỗi này khi cố tạo virtualenvlệnh bằng virtualenv myVirtualEnv. Tôi chỉ thêm một sudotrước lệnh; nó đã giải quyết mọi thứ.


Đó không phải là một giải pháp: Tôi chạy dưới quyền root trong docker và gặp vấn đề tương tự. Ngoài ra, bạn không giải thích lý do tại sao chạy như root lại giúp ích.
Eric

1
@Eric, tôi vừa sử dụng phương pháp tiếp cận thử & lỗi; Tôi không biết mục đích cơ bản. Nó làm việc cho tôi, vì vậy tôi đề nghị.
Zeinab Abbasimazar

1

Giải pháp:
1. sudo apt remove python-pip
2. pip3 install pip(hoặc cài đặt pip bằng get-pip.py )

Lý do:
Lỗi này xảy ra trên pip 8.0.1 được cài đặt bởi apt-get. Và chỉ xảy ra khi mạng của bạn không ổn định.

Nếu bạn đã cài đặt một pip với apt, nó sẽ ẩn pip mà bạn đã cài đặt theo các cách khác, vì vậy bạn nên xóa apt trước.

Tôi đã ngắt kết nối mạng và kiểm tra 8.0.1, 9.0.3, 10.x 3 phiên bản được cài đặt bằng pip3 hoặc get-pip.py, không có lỗi nào xảy ra. Vì vậy, tôi nghĩ chỉ có phiên bản apt của pip 8.0.1 là có lỗi đó, các phiên bản khác vẫn ổn.


1

Trong trường hợp của tôi, tôi đã mở Pycharm ở chế độ sudo và đang chạy pip install nltk trong thiết bị đầu cuối pycharm hiển thị lỗi này. chạy với sudo pip install sẽ giải quyết được lỗi.


0

Tôi cũng đã có vấn đề này. Ban đầu, một proxy đã được thiết lập và hoạt động tốt. Sau đó, tôi kết nối với một mạng mà nó không đi qua proxy. Sau khi bỏ đặt proxy pip lại hoạt động.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY

0

Thật kỳ lạ nếu tôi xóa proxy khỏi môi trường và thêm nó vào dòng lệnh nó phù hợp với tôi. Ví dụ để piptự nâng cấp :

env http_proxy= https_proxy= pip install pip --upgrade --proxy 'http://proxy-url:80'

Vấn đề của tôi là có proxy trong môi trường. Có vẻ như pip chỉ tôn vinh một trong những đối số.


0

Đây là giải pháp làm việc cho vấn đề này mà tôi tìm thấy.

sudo apt-get clean
cd /var/lib/apt
sudo mv lists lists.old
sudo mkdir -p lists/partial
sudo apt-get clean
sudo apt-get update

0

Đối với bản thân tôi, nó chỉ ra rằng wlan0 đã bị lỗi, dẫn đến việc tôi không thể kết nối. Vì vậy, đảm bảo rằng wlan0 đã được thiết lập, cho phép pip / pip3 hoạt động mà không có vấn đề gì.


0

Tôi đã thử giải pháp được trả lời ở trên:

apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py

Khi tôi cố gắng

python get-pip.py 
python3 get-pip.py

Tôi nhận được tin nhắn này

 Could not install packages due to an EnvironmentError:
[Errno 13] Permission denied: /usr/bin/pip3 Consider using the --user
 option or check the permissions.

Tôi đã làm như sau và nó hoạt động

python3 -m venv env
source ./env/bin/activate
Sudo apt-get update 
apt-get remove python-pip python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
python3 get-pip.py
pip3 install pip
sudo easy_install pip
pip install --upgrade pip
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.