Sudo altında pip kurulumunu çalıştırmak kabul edilebilir ve güvenli midir?


115

Mac'imi Python paketlerini iş yerindeki Windows bilgisayarımla yaptığım gibi yüklemek için kullanmaya başladım; ancak Mac'imde günlük dosyalarına veya site paketlerine yazarken sık sık izin verilmeyen hatalarla karşılaşıyorum.

Bu nedenle , pip install <package>altında koşmayı düşündüm , sudoancak bunun sadece mevcut kullanıcı hesabımın altına yüklenmesini istediğimi düşünürsek, güvenli / kabul edilebilir bir sudo kullanımı mı?

Günlük dosyası G / Ç hatasından geri dönüş örneği:

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'

Güncelleme Bu muhtemelen izinlere bağlıydı, ancak en iyi yaklaşım python projeleriniz için sanal ortamları kullanmaktır. Koşu sudo pipkesinlikle gerekli olmadıkça kaçınılmalıdır.


12
Bunun cd /tmp; sudo pip install fooyeterli bir geçici çözüm olduğunu görüyorum .
Brian Cain


@pradyunsg neden bu kadar eski bir soruyu işaretliyorsunuz?
markwalker_

3
Özünde, şu anki kabul edilen cevap (ve sorudaki güncelleme) "sudo pip" çalıştırmayı öneriyor - pip'in bakımcılarının (ben de onlardan biri) insanlara aktif olarak yapmamalarını söylediği bir şey, çünkü bu işletim sisteminizi bozabilir. MacOS ve birçok (tümü?) büyük Linux dağıtımlarında. Buraya kendi durumlarında hata ayıklayan birinin yapabileceği terimleri kullanırken geldim ve sadece bu insanları daha iyi tavsiyelerde bulunan bir yere yönlendirmek istedim. Bu soruyu gerçekten getirmeyi düşünmedim ve yukarıdaki ifadeye uygun olarak daha iyi cevap verdi. (karakter
kalmadı

@markwalker_ bu tavsiyeyi sorudan çıkarmaya ve muhtemelen onu daha iyi bir tavsiye ile değiştirmeye istekli olur muydunuz (--user veya virtualenv kullanarak)?
pradyunsg

Yanıtlar:


105

Bir sanal ortam kullanın :

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

Yalnızca sudogenel, sistem çapında Python kurulumu için bir şeyler yüklemek istediğinizde veya yükseltilmiş izinleri kullanırsınız.

Paketleri sizin için izole eden bir sanal ortam kullanmak en iyisidir. Bu şekilde, global python kurulumunu kirletmeden oynayabilirsiniz.

Bonus olarak, virtualenv'in yükseltilmiş izinlere ihtiyacı yoktur.


2
Ana dizini için izinleri
bozulmuşsa

1
Evet, olacak, ama zaten oldu, bu yüzden devam etmeden önce düzeltmesi gerekiyor.
hd1

1
Teşekkürler çocuklar, daha önce virtualenv hakkında bir şeyler okudum, bu yüzden umarım bu iki çözüm birlikte beni tekrar yoluna
sokar

1
Ayrıca, virtualenv'yi yüklemek için sudo yapmanız gerekiyor ... yoksa bir çözüm var mı?
jimijazz

8
Bunun neden en iyi cevap olduğunu anlamıyorum. Soru sanal ortamlarla ilgili DEĞİL. Kullanmanın geçerliliği ile ilgili sudo pip install. Diyelim ki birçok projede veya sistem seviyesinde kullanacağım bir paket kurmam gerekiyor. Gibi bazı CLI aracı gibi pgcli. Açıkçası bunun için bir sanal ortama ihtiyacım yok, onu global olarak kurmak istiyorum. Kullanmalı mıyım sudo pip installyoksa daha doğru uygulamalar var mı? İşte soru bu.
Alex Belyaev

42

pip installAltında koşmak kabul edilebilir ve güvenli misudo mi?

Güvenli değil ve hoş karşılanmıyor - bkz . 'Sudo pip' çalıştırmanın riskleri nelerdir? Python paketini ana dizininize kurmak için kök ayrıcalıklarına ihtiyacınız yoktur. Bkz açıklamasına ait --userpip seçeneği.


Çözümünüz gerçekten işe yarayan ilk çözüm olsa da, @throws_exceptions_at_you , belgelere yönlendirme yerine gerçek kodla bir yanıt oluşturdunuz
Edenshaw

Ben yaptım sudo pip installbunu kullanmanın zararlarını bilmiyor. Bu komutu veya altında çalışmayı engellemeyi nasıl geri alabilirim sudo?
Emre Değirmenci

26

Asıl sorununuz, pip'in günlükleri klasöre yazamamasıdır.

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

Sen süreç gibi yazabilirsiniz çağrılan bir klasörün içine cd gereken /tmpbir nedenle cd /tmpmuhtemelen iş ve komutu çağırarak yeniden ama ne istediğinizi değil.

AMA aslında bu özel durum için ( sudopython paketlerini kurmak için kullanmak istemiyorsunuz ) ve global paket kurulumlarına gerek yok, şu şekilde --userbayrağı kullanabilirsiniz :

pip install --user <packagename>

ve gayet iyi çalışacak.

Tek kullanıcılı bir python python kurulumunuz olduğunu ve virtualenv (çok kullanıcı dostu olmayan) veya pipenv hakkında okumakla uğraşmak istemediğinizi varsayıyorum. .

Yorumlar bölümündeki bazı kişilerin belirttiği gibi, bir sonraki yaklaşım, ne yapacağınızı bilmediğiniz ve takılıp kalmadığınız sürece pek iyi bir fikir değildir:

Sizin durumunuzda olduğu gibi küresel paketler için başka bir yaklaşım şunun gibi bir şey yapmak istiyorsunuz:

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

veya daha genel olarak

chown -R $USER <path to your global pip packages>

9
-1 Global site paketleri klasörünün sahipliğini değiştirmek , yapılacak korkunç bir şeydir. --userPip için seçenek seninkini yazdığında zaten var olmuş cevabım çözüm olarak verildi.
Piotr Dobrogost

1
Burada bir tartışma göremiyorum. Ayrıca, böyle bir giriş seviyesi sorusunu soran birinin muhtemelen unix'in izin sistemine aşina olmadığı ve bu nedenle 1 kullanıcılı bir yüklemeyi çalıştırdığı gerçeği göz önüne alındığında, bunun bir önemi yoktur. Ayrıca cevabınız, aslında global paketlere kurmak İSTİYORUM benim kullanım durumumu ele almıyor. Bunu yaptıktan sonra izinleri kolayca ön yüklemeye geri döndürebilirim.
throws_exceptions_at_you

2
Tüm komutları yazmak için +1 . Bazı insanlar OP'nin kendileri veya diğer okuyucular yapamayacakları durumda komut satırında bir seçeneği nasıl uygulayacağını bildiğini varsayar . Aynı fikirde değil misin @PiotrDobrogost?
Let Me Tink Hakkında It

eklemek --userbana yardımcı oluyor!
Honghao Zhang

2
Sistem Python'un tüm site-packagesdizini için izinleri değiştirmek, bir pompayı anahtarla vurarak "tamir etmeye" benzer. Bir nedenden dolayı korunur - oraya bir şeyler yüklememeniz gerekir . Gerçek çözüm günden güne programlama sistem Python dağılımı karıştırmak için değil. Farklı bir Python dağıtımı kurun (Python.org, Homebrew, Canopy, vb.).
charlesreid1

9

Ben de aynı sorunu yaşadığım için, Brian Cain'in ilk yorumunun "IOError: [Errno 13]" sorununa çözüm olduğunu vurgulamak istiyorum :

Temp dizininde ( cd /tmp) çalıştırılırsa, çalıştırırsam IOError artık oluşmuyor sudo pip install foo.


2
Bunun sizin için neden sorunu çözdüğünü açıklama şansınız var mı?
Chris

8
Hala sudo pipbu "çözümü" kullanıyorsunuz ve bu nedenle kök ayrıcalıklarına sahip paketleri kuruyorsunuz, muhtemelen istediğiniz şey bu değil?
Chris

Bunun neden işe yaradığını sadece tahmin edebiliyorum: Bence (bazı) pip kurulum betiklerinin bir kısmının mevcut dizine yazma erişimi gerektirdiğini, ancak farklı bir kullanıcıyla. Bu nedenle, ana dizininizdeyken çalıştırılırsa, yazma erişiminin olmaması nedeniyle gizemli bir şekilde başarısız olur. İçinden çağrılırsa /tmpçalışır, çünkü orada herkesin yazma erişimi vardır.
Edgar

'/Users/markwalker/Library/Logs/pip.log' adresine yazma erişimi yok
throws_exceptions_at_you

5

virtualenvwrapperBaşarıyla kurduktan sonra bir sorunla karşılaştım virtualenv.

Bunu yaptıktan sonra terminalim şikayet etti:

pip install virtualenvwrapper

Bu yüzden, bunu başarısız bir şekilde denedim (ÖNERİLMEZ) :

sudo pip install virtualenvwrapper

Sonra, bunu başarıyla yükledim:

pip install --user virtualenvwrapper

Pip için --user seçeneği, siz sizinkini yazarken zaten var olan cevabımda bir çözüm olarak verildi. Bu bir cevap değil yorum olmalıydı.
Piotr Dobrogost

Tavsiye edilmiyor diyorsunuz, ancak resmi kurulum notları sudo ile virtualenvwrapper'ı yüklemek için Tamam diyor. Aynı şey virtualenv için de geçerli. Burada sorulan soru bu ikisine atıfta bulunmuyor, bu yüzden buradaki diğer tüm yanıtların genel python paketleri için olduğunu varsayıyorum.
mehmet

Gelecekteki okuyuculara, yukarıdaki yorum nedeniyle cevabımda "tavsiye edilmeyen" bayrağımı vurdum, ancak henüz doğrulamadım. Bu yüzden henüz bayrağı silmedim.
Let Me Tink About It

4

Görünüşe göre izinleriniz bozulmuş. Tip chown -R markwalker ~Terminalinde ve denemek piptekrar? Sıralanırsan bana haber ver.


Bu izin sorununu çözse de soruyu yanıtlamaz.
Burhan Khalid

1
Sahip olduğumu bilmediğim sorunları çözmek bir bonus! gibi birçok gizli dizini chownveriyor Operation not permittedve .shshşimdi ayarlayabileceği dosyalar üzerinde çalıştığını varsayıyorum, ancak cli komut istemi döndüğünde ne olacağını göreceğim.
markwalker_
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.