Apakah pip menimpa paket yang diinstal oleh apt-get?

9

Apa yang terjadi jika saya tidak sengaja pip installmenggunakan paket yang sudah saya instal apt-getsebelumnya? Apakah saya cukup menggunakan versi terbaru (mungkin yang saya instal gunakan pip)? Apa yang terjadi sebaliknya?

Catatan: Saya tidak menggunakan Python di lingkungan virtual (hanya karena saya tidak tahu mengapa saya harus - Saya menggunakan Python sebagai alat analisis data dan kebanyakan mencoba menggunakan versi terbaru dari semuanya).

Fred S
sumber
Jika saya tidak salah, Anda tidak menginstal paket yang sama menggunakan apt-getdanpip
Lucio
Corerct, pipinstal mereka di /usr/localsubdirektori secara default atau direktori lain jika Anda mau.
Timo
3
Tetapi apa yang terjadi, misalnya, jika saya pertama kali apt-get install python-pandasdiikuti oleh pip install pandas, atau sebaliknya? Bagaimana cara instalasi python global saya tahu yang mana dari kedua versi yang digunakan?
Fred S
1
@ FredS: Jalankan perintah berikut di terminal, Python akan mencari dalam urutan tertentu untuk modul:python -c "import sys; print sys.path"
Timo

Jawaban:

3

Seperti @Timo disebutkan dalam komentarnya, python -c "import sys; print sys.path"akan memberi Anda jalur pemuatan modul Python untuk pemasangan Python Anda. Pada pemasangan yang relatif baru 16,04, ada tiga direktori catatan (di antara 10 total yang ada di tambang):

  • '' (direktori aplikasi)
  • '/usr/local/lib/python2.7/dist-packages' (di mana pip menginstal modul)
  • '/usr/lib/python2.7/dist-packages' (di mana perlu menginstal modul)

Namun yang paling penting untuk dicatat adalah bahwa '/usr/local/lib/python2.7/dist-packages' lebih tinggi dalam presedensi daripada '/usr/lib/python2.7/dist-packages'.

Jika Anda pertama kali menginstal paket Python melalui apt (-get), itu akan diinstal ke '/usr/lib/python2.7/dist-packages'. Jika Anda kemudian mencoba dan menggunakan pip untuk menginstal modul, pip awalnya akan memberikan peringatan bahwa ketergantungan sudah terpenuhi, kemudian keluar; menambahkan flag --upgrade akan memaksa pip untuk menginstal, memasang modul ke '/usr/local/lib/python2.7/dist-packages'. (Perhatikan output yang juga mengatakan bahwa versi di '/usr/lib/python2.7/dist-packages' tidak dihapus) Anda dapat kemudian verifikasi bahwa versi pip-instal adalah salah satu yang digunakan dengan menggunakan berikut: python -c "import MODULE; print MODULE.__file__".

Dengan demikian, ini menunjukkan bahwa paket yang diinstal melalui pip akan diutamakan daripada paket yang diinstal sistem, tetapi tidak akan menimpa apa pun yang diinstal dari apt (-get).

Bryan Wyatt
sumber
1

Untuk menambah @Bryan Wyatt, tampaknya diinginkan (dan dimaksudkan) bahwa item yang diinstal / ditingkatkan PIP harus diutamakan daripada paket yang diinstal (mungkin lebih tua) APT. Sistem saya memiliki jalur apt dan pip terbalik. Seharusnya (mengabaikan entri lain):

  • '/usr/local/lib/python2.7/dist-packages' (di mana pip menginstal modul)
  • '/usr/lib/python2.7/dist-packages' (di mana perlu menginstal modul)

Namun karena beberapa tindakan yang tidak diketahui yang harus saya ambil, jalur ini muncul dalam urutan yang berlawanan bagi saya (mengabaikan entri lain):

  • '/usr/lib/python2.7/dist-packages' (di mana perlu menginstal modul)
  • '/usr/local/lib/python2.7/dist-packages' (di mana pip menginstal modul)

Ternyata sesuatu yang saya menambahkan /usr/lib/python2.7/dist-packagesuntuk /usr/local/lib/python2.7/dist-packages/easy-install.pth. Cukup menghapus garis dari easy-install.pthmemperbaiki kesalahan untuk saya. /usr/lib/python2.7/dist-packagesmasih di jalur saya, karena akan ditambahkan pada tahap selanjutnya di tempat lain.

Sebagai catatan tambahan, sidik jari akan menampilkan jalur Anda lebih baik ... yaitu:

$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
dekat
sumber