Penginstalan PIP Python melempar TypeError: jenis operan tidak didukung untuk - =: 'Retry' dan 'int'

107

Menggunakan pip installuntuk modul apa pun tampaknya pada sistem Ubuntu 16.04 saya dengan python 2.7.11+ membuat kesalahan ini:

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

Apa yang salah dengan pip? Bagaimana saya bisa menginstal ulang, jika perlu?

Pembaruan: Penelusuran balik penuh ada di bawah

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'
devautor
sumber
@MartijnPieters Tentu, menambahkan info itu
devautor
Jadi dari mana asalnya roda-roda itu? pipbiasanya akan menggunakan requestspaket tertanam , dan requestsbiasanya akan menggunakan urllib3paket tertanam . Roda tersebut bukan versi yang disematkan, dan mungkin tidak kompatibel dengan pipsubkelas dari beberapa kode ini. bergerak /usr/share/python-wheelske samping mungkin?
Martijn Pieters
Saya berharap pipuntuk menggunakan pip/_vendor/requests/dan pip/_vendor/requests/packages/urllib3/, bukan /usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requestsatau /usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl/urllib3.
Martijn Pieters
Saya sama sekali tidak tahu tentang ini! Di mana saya harus mencari info tentang ini, atau apa yang dapat saya lakukan?
devautor
Maaf, tidak ada jawaban yang mudah di sini; hanya mencoba mendiagnosis masalah Anda. Pelacakan tidak terduga dan menunjukkan bentrokan antar versi. Itulah sebabnya biasanya requestsdan pipembed dependensinya. Pelacakan balik Anda menunjukkan bahwa versi tersemat tidak digunakan, tetapi mengapa saya tidak tahu.
Martijn Pieters

Jawaban:

87

Ubuntu hadir dengan versi PIP dari precambrian dan begitulah cara Anda memutakhirkannya jika Anda tidak ingin menghabiskan berjam-jam men-debug masalah terkait pip.

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

Seperti yang Anda amati, saya menyertakan informasi untuk Python 2.x dan 3.x

sorin
sumber
2
Melakukan python get-pip.py gagal dengan "OSError: [Errno 13] Izin ditolak: '/usr/local/lib/python2.7/site-packages/pip-8.1.2.dist-info'"
devautor
2
@mirror, gunakan sudo karena get-pip.py akan mencoba menginstal pip
Raghuram Vadapalli
45
Masalah ini tidak ada hubungannya dengan pip. jejak tumpukan menunjukkan bahwa permintaan untuk mendapatkan paket gagal, menunjukkan masalah jaringan. Memberi tahu OP untuk menginstal ulang pip hanya akan menjadi jalan memutar.
Thom
2
ini adalah jawaban yang benar, pelakunya adalah canonical patching pipyang tetap tidak diperbaiki untuk beberapa rilis sekarang: github.com/pypa/pip/issues/4779
lurscher
2
Digunakan di raspberian. Tidak dapat menjalankan "pip" lagi. Hanya dapat menjalankan pip3. Saya harus menambahkan tautan simbolis: ln -s / usr / local / bin / pip / usr / bin / pip diambil (dan dimodifikasi) dari jawaban ini: stackoverflow.com/questions/29712519/…
TheTrowser
37

Jika Anda berada di belakang proxy, Anda harus melakukan beberapa langkah konfigurasi tambahan sebelum memulai penginstalan. Anda harus menyetel variabel lingkungan http_proxy ke alamat proxy. Menggunakan bash ini dilakukan dengan perintah

export http_proxy="http://user:[email protected]:port/" 

Anda juga bisa menyediakan

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

parameter ke pip. The [user:pass@]porsi opsional.

Livruen Nati
sumber
25

Memperbarui alat pengaturan telah berhasil dengan baik untuk saya.

sudo pip install --upgrade setuptools
Matheswaran Kanagarajan
sumber
Bekerja untuk saya juga. Sebenarnya, setelah melakukan ini, saya menyadari bahwa kesalahan biasanya muncul setelah: Mengumpulkan alat-alat setup (dari kiwisolver> = 1.0.1-> matplotlib)
mayid
3
Ini bekerja untuk saya juga pada Raspian Stretch. Harap terima jawaban ini agar lebih mudah menemukan
Sam Hammamy
membutuhkan reboot setelah itu untuk memanggangnya bekerja dengan raspbian
Pipo
4
Perintah ini menyebabkan TypeError yang sama untuk saya di Debian9. Ini bukan solusi universal.
sir__finley
15

Pertama-tama, masalah ini muncul karena masalah jaringan, dan menghapus dan menginstal ulang semuanya tidak akan banyak membantu. Mungkin Anda berada di belakang proxy, dan dalam hal ini Anda perlu menyetel proxy.

Tetapi dalam kasus saya, saya menghadapi masalah karena saya tidak berada di belakang proxy. Secara umum, saya bekerja di belakang proxy, tetapi ketika bekerja dari rumah, saya mengatur proxy ke Tidak ada di pengaturan Jaringan.

Tetapi saya masih mendapatkan kesalahan yang sama bahkan setelah menghapus pengaturan proxy.

Jadi, saat saya mengetik

env | grep proxy

Saya menemukan sesuatu seperti ini:

http_proxy=http://127.0.0.1:1234/

Dan inilah alasan mengapa saya masih mendapatkan kesalahan yang sama, bahkan ketika saya pikir saya telah menghapus pengaturan proxy.

Untuk menghapus proxy ini, ketik

unset http_proxy

Ikuti pendekatan yang sama untuk semua entri lainnya, seperti https_proxy.

thisisashwani
sumber
14

Apa yang terjadi di sini adalah bahwa versi permintaan / urllib3 yang berjualan bentrok ketika diimpor di dua tempat berbeda (kode yang sama, tetapi nama berbeda). Jika Anda kemudian mengalami kesalahan jaringan, itu tidak mencoba lagi untuk mendapatkan roda, tetapi gagal dengan kesalahan di atas. Lihat di sini untuk mendalami kesalahan ini lebih dalam.

Untuk solusi dengan pip sistem, lihat di atas .

Jika Anda memiliki masalah ini di virtualenv yang dibangun oleh python -m venv(yang masih menyalin roda dari /usr/share/python-wheels, bahkan jika Anda memasang pip secara terpisah), cara termudah untuk "memperbaikinya" tampaknya adalah:

  1. buat virtualenv: /usr/bin/python3.6 -m venv ...
  2. instal requestske lingkungan (ini mungkin menimbulkan kesalahan di atas):<venv>/bin/pip install requests
  3. hapus versi yang disalin requestsyang akan digunakan oleh pip:rm <venv>/share/python-wheels/{requests,chardet,urllib3}-*.whl

Sekarang a <venv>/bin/pipmenggunakan versi terinstal requestsyang memiliki vendor urllib3.

Jan Katins
sumber
Terima kasih, saya baru saja menghapus ini /usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whldan sudah diperbaiki sekarang (tanpa virtualenv).
krsoni
Sebenarnya dalam kasus saya, saya tidak menggunakan virtual env.
krsoni
Jika Anda menghapus file whl secara langsung /usr/share/python-wheels, python -m venvtidak akan bisa digunakan <venv>/bin/pip lagi. Jadi, jika Anda menghapus file-file ini, Anda harus yakin bahwa Anda tidak membutuhkannya. Jika Anda memang membutuhkan pip sistem dan pip venv, Anda perlu menginstal sistem dengan get-pip.py(Lihat stackoverflow.com/a/37531821/1380673 ) dan Anda perlu menghapus file whl di setiap venv.
Jan Katins
7

port 443 tidak terbuka, cukup izinkan port tcp kustom 443 jika di AWS lain buka port 443 untuk koneksi keluar ...

Deepak
sumber
Ini sangat membantu saya dalam cluster OpenStack saya !! Bagus Deepak!
Arun Das
5

Tingkatkan saja pip yang berhasil untuk saya:

pip install --upgrade pip

cleicar
sumber
5
kesalahan terjadi pada saya saat menjalankan perintah yang sangat tepat ini :(
allan.simon
Itu memperbaiki kesalahan untuk saya pada Raspbian Sketch Lite.
Raúl Salinas-Monteagudo
1
Saya juga menjalankan Raspian Stretch Lite dan itu tidak memperbaiki kesalahan.
Stefan Wegener
Saya setuju ini bekerja dengan baik "python -m pip install --upgrade pip"
imbatman
2

Saya memiliki masalah yang sama saat menginstal RaspberryPI TFT dari Adafruit dengan pitft.sh / adafruit-pitft.sh .

Saya tidak senang dengan gaya pengkodean dengan kesalahan dari suatu tempat untuk ditafsirkan entah bagaimana - seperti yang bisa dilihat pada jawaban sebelumnya.

Catatan: Pengecualian kesalahan jenis retry.py jelas merupakan bug, yang disebabkan oleh tugas dan kalkulasi yang tidak tepat dari sebuah instance kelas. Balas ke int dengan nilai default 10 - di suatu tempat dalam kode ... Harus diperbaiki baik dengan menambahkan operator-di tempat, atau memperbaiki tugas yang salah.

Jadi cobalah menganalisis dan menambal kesalahan itu sendiri terlebih dahulu. Kesalahan sebenarnya dalam kasus saya adalah sama - retry.py dipanggil oleh pip .

Skrip instalasi adafruit-pitft.sh / pitft.sh mencoba menerapkan urllib3 yang dengan sendirinya mencoba menginstal dependensi bersarang dengan pip , jadi kesalahan yang sama.

adafruit-pitft.sh # atau pitft.sh

...

_stacktrace = sys.exc_info () [2]) Berkas "/usr/share/python-wheels/urllib3-1.13.1-py2.py3 none-any.whl / urllib3 / util / retry.py", baris 228, di kenaikan

total - = 1

TypeError: jenis operan tidak didukung untuk - =: 'Retry' dan 'int'

Untuk distribusi saat ini (berdasarkan debian-9.6.0 / stretch):

File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", baris 315, secara bertahap

total - = 1

TypeError: jenis operan tidak didukung untuk - =: 'Retry' dan 'int'

Patch berikut - dirty * :) - memungkinkan jejak kesalahan yang terdengar:

# 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

Output yang terdengar dengan tambalan sementara (ditampilkan dua kali ...?):

Mencoba lagi (Retry (total = 1, connect = None, read = None, redirect = None)) setelah koneksi diputus oleh 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection objek di /

Mencoba lagi (Retry (total = 0, connect = None, read = None, redirect = None)) setelah koneksi diputus oleh 'ConnectTimeoutError (<requests.packages.urllib3.connection.VerifiedHTTPSConnection objek di /

Tidak dapat menemukan versi yang memenuhi persyaratan evdev (dari versi:)

Tidak ada distribusi yang cocok untuk evdev

PERINGATAN: Pip gagal menginstal perangkat lunak!

Jadi dalam kasus saya sebenarnya ada dua hal yang menyebabkan kesalahan, ini mungkin berbeda di lingkungan lain:

  1. hilang evdev => mencoba untuk menginstal
  2. Gagal menghubungkan repo / dist yang berisi evdev untuk mengunduh. => akhirnya menyerah

Lingkungan instalasi saya offline dari cermin debian + raspbian internal, jadi saya tidak ingin mengatur proxy ...

Jadi saya melanjutkan dengan instalasi manual dari komponen evdev yang hilang :

  1. unduh evdev dari PyPI (atau misalnya dari github.com):

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

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

  2. Buka kemasan dan instal secara manual sebagai pengguna root - untuk semua akun lokal, sehingga terdeteksi sebagai terinstal:

    sudo su -

    tar xf evdev-1.1.2.tar.gz

    cd evdev-1.1.2

    python setup.py install

  3. Panggil skrip instal lagi:

    adafruit-pitft.sh # atau pitft.sh

    ... Jawab dialog ...

    ...itu dia.

Jika Anda melanjutkan online dengan akses PyPI langsung :

  1. periksa perutean + firewall Anda untuk akses ke pypi.org

  2. setel proxy jika diperlukan (http_proxy / https_proxy)

Dan berhasil ..

Semoga ini bisa membantu dalam kasus lain juga.

Arno-Can Uestuensoez

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

Lihat juga: issue - 35334: https://bugs.python.org/issue35334

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

Lihat sekarang juga: masalah - 1486: https://github.com/urllib3/urllib3/issues/1486

untuk file: https://github.com/urllib3/urllib3/blob/master/src/urllib3/util/retry.py

acue
sumber
2

periksa masalah jaringan, untuk melewati kode kasus pengecualian

Dalam kasus saya, saya menggunakan indeks khusus, indeks tersebut tidak memiliki rute dan itu akan memicu kode kasus pengecualian. Bug kasus pengecualian masih ada dan masih menutupi masalah sebenarnya, namun saya dapat mengatasinya dengan menguji konektivitas dengan alat lain seperti nc -vzw1 myindex.example.org 443dan mencoba lagi ketika jaringan sudah aktif.

ThorSummoner
sumber
1

Saya menghadapi masalah serupa ketika mencoba menginstal alat awscli pada contoh ec2. Saya mengubah grup keamanan untuk mengizinkan akses masuk dan keluar port 443 dan itu memecahkan masalah bagi saya.

Yogesh Gupta
sumber
Ini tidak memberikan jawaban atas pertanyaan tersebut. Setelah memiliki reputasi yang memadai, Anda dapat mengomentari kiriman apa pun ; sebagai gantinya, berikan jawaban yang tidak memerlukan klarifikasi dari penanya . - Dari Ulasan
Lukas Körfer
1
Apakah sekarang terlihat lebih baik? Saya hanya berpikir saya harus menyebutkan apa yang menurut saya berguna
Yogesh Gupta
1

Saya mendapat kesalahan ini ketika saya mencoba membuat virtualenvdengan perintah virtualenv myVirtualEnv. Saya baru saja menambahkan sudosebelum perintah; itu memecahkan segalanya.

Zeinab Abbasimazar
sumber
Ini bukan solusi: Saya menjalankan sebagai root di buruh pelabuhan dan memiliki masalah yang sama. Anda juga tidak menjelaskan mengapa menjalankan sebagai root membantu.
Eric
1
@ Eric, saya baru saja menggunakan pendekatan coba & kesalahan; Saya tidak tahu tujuan yang mendasarinya. Itu berhasil untuk saya, jadi saya menyarankan.
Zeinab Abbasimazar
1

Solusi:
1. sudo apt remove python-pip
2. pip3 install pip(atau instal pip by get-pip.py )

Mengapa:
Kesalahan ini terjadi pada pip 8.0.1 yang diinstal oleh apt-get. Dan hanya terjadi ketika jaringan Anda tidak stabil.

Jika Anda memiliki pip yang diinstal dengan apt, itu menyembunyikan pip yang Anda instal dengan cara lain, jadi Anda harus menghapus apt terlebih dahulu.

Saya memutus jaringan dan menguji 8.0.1, 9.0.3, 10.x 3 versi yang diinstal dengan pip3 atau get-pip.py, tidak ada kesalahan yang terjadi. Jadi, saya pikir hanya versi apt dari pip 8.0.1 yang memiliki bug itu, yang lainnya tidak masalah.

Haocheng Yang
sumber
1

Dalam kasus saya, saya telah membuka Pycharm dalam mode sudo, dan menjalankan pip install nltk di terminal pycharm yang menunjukkan kesalahan ini. berjalan dengan sudo pip install memecahkan kesalahan.

Aayush Arora
sumber
0

Saya juga mengalami masalah ini. Awalnya, proxy disetel dan berfungsi dengan baik. Kemudian saya terhubung ke jaringan yang tidak melalui proxy. Setelah membatalkan proxy pip lagi bekerja.

unset http_proxy; unset http_prox;  unset HTTP_PROXY; unset HTTPS_PROXY
GPrathap
sumber
0

Anehnya jika saya menghapus proxy dari lingkungan dan menambahkannya ke baris perintah, itu berfungsi untuk saya. Misalnya untuk meningkatkan pipdirinya sendiri:

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

Masalah saya adalah memiliki proxy di lingkungan. Tampaknya pip hanya menghormati yang ada dalam argumen.

Eric
sumber
0

Ini adalah solusi yang berfungsi untuk masalah yang saya temukan ini.

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
PSN
sumber
0

Bagi saya sendiri, ternyata wlan0 sedang down, yang mengakibatkan saya tidak bisa tersambung. Jadi, memastikan bahwa wlan0 sudah aktif, biarkan pip / pip3 berfungsi tanpa masalah.

japharl
sumber
0

Saya mencoba solusi yang dijawab di atas:

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

Ketika saya mencoba

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

Saya mendapat pesan ini

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

Saya melakukan hal berikut dan berhasil

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
i_thamary
sumber