Apakah dapat diterima dan aman untuk menjalankan pip install di bawah sudo?

114

Saya mulai menggunakan Mac saya untuk menginstal paket Python dengan cara yang sama saya lakukan dengan PC Windows saya di tempat kerja; namun pada Mac saya, saya sering menjumpai kesalahan izin ditolak saat menulis ke file log atau paket situs.

Oleh karena itu saya berpikir untuk berjalan di pip install <package>bawah sudotetapi apakah itu penggunaan sudo yang aman / dapat diterima mengingat saya hanya ingin ini dipasang di bawah akun pengguna saya saat ini?

Contoh pelacakan balik dari kesalahan I / O logfile:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Perbarui Ini mungkin karena izin, namun pendekatan terbaik adalah menggunakan lingkungan virtual untuk proyek python Anda. Berlari sudo pipharus dihindari kecuali benar-benar diperlukan.

markwalker_
sumber
12
Saya menemukan bahwa ' cd /tmp; sudo pip install foo' adalah solusi yang memadai.
Brian Cain
1
Kemungkinan duplikat dari Apa risiko menjalankan 'sudo pip'?
pradyunsg
@pradyunsg mengapa menandai pertanyaan lama seperti itu?
markwalker_
3
Intinya, jawaban yang diterima saat ini (dan pembaruan dalam pertanyaan) menyarankan untuk menjalankan "sudo pip" - sesuatu yang pengelola pip (saya salah satunya) secara aktif memberi tahu orang-orang untuk tidak melakukannya karena dapat mengakibatkan kerusakan sistem operasi Anda di MacOS dan banyak (semua?) distribusi Linux utama. Saya mendarat di sini saat menggunakan istilah yang mungkin dilakukan seseorang untuk men-debug situasi mereka dan hanya ingin membuat ini mengarahkan orang ke lokasi dengan saran yang lebih baik. Tidak berpikir untuk benar-benar mengajukan pertanyaan ini dan jawabannya lebih baik sesuai dengan pernyataan di atas. (dari karakter)
pradyunsg
@markwalker_ maukah Anda menghapus saran itu dari pertanyaan dan mungkin menggantinya dengan saran yang lebih baik (menggunakan --user atau virtualenv)?
pradyunsg

Jawaban:

105

Gunakan lingkungan virtual :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

Anda hanya menggunakan sudoatau izin yang ditinggikan saat Anda ingin menginstal barang untuk instalasi Python global di seluruh sistem.

Cara terbaik adalah menggunakan lingkungan virtual yang mengisolasi paket untuk Anda. Dengan begitu Anda bisa bermain-main tanpa mencemari instalasi python global.

Sebagai bonus, virtualenv tidak membutuhkan izin yang lebih tinggi.

Burhan Khalid
sumber
2
Jika izinnya kacau untuk direktori rumahnya , menggunakan virtualenv kemungkinan tidak akan membantunya
hd1
1
Ya, itu akan terjadi, tetapi itu sudah terjadi, jadi dia perlu memperbaikinya sebelum melanjutkan.
hd1
1
Terima kasih teman-teman, saya telah membaca tentang virtualenv sebelumnya jadi semoga kedua solusi ini bersama-sama akan membuat saya kembali ke jalurnya :)
markwalker_
1
juga, untuk menginstal virtualenv Anda perlu sudo ... atau apakah ada solusi?
jimijazz
8
Saya tidak mengerti mengapa ini adalah jawaban terbaik. Pertanyaannya BUKAN tentang lingkungan virtual. Ini tentang validitas penggunaan sudo pip install. Katakanlah saya perlu menginstal beberapa paket yang akan saya gunakan di banyak proyek atau di tingkat sistem. Seperti beberapa alat CLI seperti pgcli. Jelas saya tidak membutuhkan virtual env untuk itu, saya ingin menginstalnya secara global. Haruskah saya menggunakan sudo pip installatau ada beberapa praktik yang lebih benar? ITULAH pertanyaannya.
Alex Belyaev
42

Apakah dapat diterima & aman untuk dijalankan pip installdi bawah sudo?

Ini tidak aman dan tidak disukai - lihat Apa saja risiko menjalankan 'sudo pip'? Untuk menginstal paket Python di direktori home Anda, Anda tidak memerlukan hak akses root. Lihat deskripsi dari --userpilihan untuk pip.

Piotr Dobrogost
sumber
Meskipun solusi Anda adalah yang pertama yang benar-benar berfungsi, @throws_exceptions_at_you membuat respons dengan kode aktual dan bukan pengalihan ke dokumentasi
Edenshaw
Saya sudo pip installtidak tahu kerusakan menggunakannya. Bagaimana cara membatalkan perintah ini atau memblokir untuk berjalan di bawah sudo?
Emre Değirmenci
26

Masalah asli Anda adalah pip tidak dapat menulis log ke folder.

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Anda perlu cd ke folder di mana proses yang dipanggil dapat menulis seperti /tmpa cd /tmpdan memanggil kembali perintah mungkin akan bekerja tetapi bukan yang Anda inginkan.

TAPI sebenarnya untuk kasus khusus ini (Anda tidak ingin menggunakan sudountuk menginstal paket python) dan tidak perlu menginstal paket global, Anda dapat menggunakan --userflag seperti ini:

pip install --user <packagename>

dan itu akan bekerja dengan baik.

Saya berasumsi Anda memiliki instalasi python python satu pengguna dan tidak ingin repot-repot membaca tentang virtualenv (yang sangat tidak ramah pengguna) atau pipenv .

Seperti yang ditunjukkan oleh beberapa orang di bagian komentar, pendekatan selanjutnya bukanlah ide yang bagus kecuali Anda tidak tahu apa yang harus dilakukan dan mengalami kebuntuan:

Pendekatan lain untuk paket global seperti dalam kasus Anda, Anda ingin melakukan sesuatu seperti:

chown -R $USER /Library/Python/2.7/site-packages/

atau lebih umum

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
sumber
9
-1 Mengubah kepemilikan folder paket situs global adalah hal yang buruk untuk dilakukan. The --userpilihan untuk pip diberikan sebagai solusi dalam jawaban saya yang sudah ada ketika Anda menulis Anda.
Piotr Dobrogost
1
Saya tidak melihat argumen di sini. Juga mengingat fakta bahwa seseorang yang menanyakan pertanyaan level awal mungkin tidak akrab dengan sistem izin unix dan oleh karena itu menjalankan instalasi 1-pengguna itu tidak masalah. Juga jawaban Anda sebenarnya gagal untuk mengatasi kasus penggunaan saya sebenarnya INGIN menginstal ke paket global. Setelah melakukan itu saya dapat dengan mudah mengembalikan izin kembali ke pra-instal.
throws_exceptions_at_you
2
1 untuk benar-benar menulis seluruh perintah. Beberapa orang berasumsi OP tahu bagaimana menerapkan opsi pada baris perintah ketika mereka, atau pembaca lain, mungkin tidak. Setujukah Anda, @PiotrDobrogost?
Let Me Tink About It
menambahkan --usermembantu saya!
Honghao Zhang
2
Mengubah hak akses sistem seluruh site-packagesdirektori Python mirip dengan "memperbaiki" pompa dengan memukulnya dengan kunci inggris. Ini dilindungi karena suatu alasan - Anda tidak seharusnya memasang barang di sana . The nyata solusi adalah untuk tidak mencampur sistem distribusi Python dengan pemrograman sehari-hari. Instal distribusi Python yang berbeda (dari Python.org, Homebrew, Canopy, dll.).
charlesreid1
9

Karena saya memiliki masalah yang sama, saya ingin menekankan bahwa sebenarnya komentar pertama oleh Brian Cain adalah solusi untuk masalah "IOError: [Errno 13]":

Jika dijalankan di direktori temp ( cd /tmp), IOError tidak terjadi lagi jika saya menjalankan sudo pip install foo.

Edgar
sumber
2
Adakah kesempatan Anda dapat menjelaskan mengapa ini menyelesaikan masalah untuk Anda?
Chris
8
Anda masih menggunakan sudo pip"solusi" ini dan dengan demikian menginstal paket dengan hak akses root, yang mungkin bukan yang Anda inginkan?
Chris
Saya hanya bisa menebak mengapa ini berhasil: Saya pikir beberapa bagian dari (beberapa) skrip instalasi pip memerlukan akses tulis ke direktori saat ini, tetapi dengan pengguna yang berbeda. Oleh karena itu, jika dijalankan saat berada di direktori home Anda, secara misterius gagal karena kurangnya akses tulis. Jika dipanggil dari /tmpdalamnya, ini berfungsi, karena setiap orang memiliki akses tulis di sana.
Edgar
Dia tidak memiliki akses tulis ke '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

Saya mengalami masalah saat menginstal virtualenvwrappersetelah berhasil menginstal virtualenv.

Terminal saya mengeluh setelah saya melakukan ini:

pip install virtualenvwrapper

Jadi, saya tidak berhasil mencoba ini (TIDAK DIANJURKAN) :

sudo pip install virtualenvwrapper

Kemudian, saya berhasil menginstalnya dengan ini:

pip install --user virtualenvwrapper
Biarkan Aku Memikirkannya
sumber
Opsi --user untuk pip diberikan sebagai solusi dalam jawaban saya yang sudah ada saat Anda menulis milik Anda. Ini seharusnya menjadi komentar bukan jawaban.
Piotr Dobrogost
Anda mengatakan TIDAK direkomendasikan tetapi catatan instalasi resmi mengatakan OK untuk menginstal virtualenvwrapper dengan sudo. Hal yang sama berlaku untuk virtualenv. Pertanyaan yang diajukan di sini tidak mengacu pada keduanya, jadi saya berasumsi semua jawaban lain di sini adalah untuk paket python umum.
mehmet
Kepada pembaca selanjutnya, saya mencoret tanda "tidak disarankan" dalam jawaban saya karena komentar di atas tetapi saya belum memverifikasinya. Itu sebabnya saya belum menghapus benderanya.
Let Me Tink About It
4

Sepertinya izin Anda kacau. Ketik chown -R markwalker ~Terminal dan coba piplagi? Beri tahu saya jika Anda sudah diurutkan.

hd1
sumber
Meskipun ini dapat menyelesaikan masalah perizinan, ini tidak menjawab pertanyaan.
Burhan Khalid
1
Memecahkan masalah yang saya tidak tahu adalah bonus! chownmemberikan Operation not permittedbanyak direktori tersembunyi seperti .shsh& saya berasumsi itu bekerja melalui file yang dapat disetel sekarang, tetapi saya akan melihat apa yang terjadi ketika cli prompt kembali.
markwalker_