Ist es akzeptabel und sicher, Pip Install unter Sudo auszuführen?

114

Ich habe begonnen, meinen Mac zu verwenden, um Python-Pakete auf die gleiche Weise zu installieren, wie ich es mit meinem Windows-PC bei der Arbeit mache. Auf meinem Mac habe ich jedoch beim Schreiben in Protokolldateien oder Site-Pakete häufig Fehler festgestellt, denen die Berechtigung verweigert wurde .

Daher habe ich darüber nachgedacht, pip install <package>unter zu laufen, sudoaber ist das eine sichere / akzeptable Verwendung von sudo, wenn man bedenkt, dass ich nur möchte, dass dies unter meinem aktuellen Benutzerkonto installiert wird?

Beispiel für ein Traceback von einem Protokolldatei-E / A-Fehler:

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'

Update Dies war wahrscheinlich auf Berechtigungen zurückzuführen. Der beste Ansatz ist jedoch die Verwendung virtueller Umgebungen für Ihre Python-Projekte. Laufen sudo pipsollte vermieden werden, es sei denn, dies ist unbedingt erforderlich.

markwalker_
quelle
12
Ich finde, dass ' cd /tmp; sudo pip install foo' eine angemessene Problemumgehung ist.
Brian Cain
1
Mögliches Duplikat von Was sind die Risiken beim Ausführen von 'sudo pip'?
Pradyunsg
@pradyunsg warum so eine alte Frage markieren?
markwalker_
3
Im Wesentlichen schlägt die derzeit akzeptierte Antwort (und das Update in der Frage) vor, "sudo pip" auszuführen - etwas, das die Betreuer von pip (ich selbst bin einer von ihnen) aktiv anweisen, dies nicht zu tun, da dies zu einem Defekt Ihres Betriebssystems führen kann unter MacOS und vielen (allen?) großen Linux-Distributionen. Ich bin hier gelandet, während ich Begriffe verwendet habe, mit denen jemand seine Situation debuggen könnte, und wollte nur, dass diese Leute mit besseren Ratschlägen an einen Ort umgeleitet werden. Ich habe nicht darüber nachgedacht, diese Frage tatsächlich zu stellen, und ihre Antwort stimmt besser mit der obigen Aussage überein. (aus Zeichen)
Pradyunsg
@markwalker_ Würdest du bereit sein, diesen Rat aus der Frage zu entfernen und ihn möglicherweise durch einen besseren Rat zu ersetzen (mit --user oder einem virtualenv)?
Pradyunsg

Antworten:

105

Verwenden Sie eine virtuelle Umgebung :

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

Sie verwenden sudooder erhöhen Berechtigungen nur, wenn Sie Inhalte für die globale, systemweite Python-Installation installieren möchten.

Verwenden Sie am besten eine virtuelle Umgebung, die Pakete für Sie isoliert. Auf diese Weise können Sie herumspielen, ohne die globale Python-Installation zu verschmutzen.

Als Bonus benötigt virtualenv keine erhöhten Berechtigungen.

Burhan Khalid
quelle
2
Wenn seine Berechtigungen für sein Home-Verzeichnis durcheinander gebracht werden, hilft ihm die Verwendung von virtualenv wahrscheinlich nicht
hd1
1
Ja, das wird es, aber es ist bereits passiert, also muss er es reparieren, bevor er fortfährt.
HD1
1
Vielen Dank, ich habe schon einmal über virtualenv gelesen. Hoffentlich bringen mich diese beiden Lösungen zusammen wieder auf den richtigen Weg :)
markwalker_
1
Außerdem müssen Sie für die Installation von virtualenv sudo ... oder gibt es eine Problemumgehung?
Jimijazz
8
Ich verstehe nicht, warum dies die beste Antwort ist. Die Frage bezieht sich NICHT auf virtuelle Umgebungen. Es geht um die Gültigkeit der Verwendung sudo pip install. Angenommen, ich muss ein Paket installieren, das ich in vielen Projekten oder auf Systemebene verwenden werde. Wie zum Beispiel ein CLI-Tool wie pgcli. Natürlich brauche ich keine virtuelle Umgebung dafür, ich möchte sie global installieren. Sollte ich verwenden sudo pip installoder gibt es einige korrektere Praktiken? Das ist hier die Frage.
Alex Belyaev
42

Ist es akzeptabel und sicher, pip installunter zu laufen sudo?

Es ist nicht sicher und wird verpönt - siehe Was sind die Risiken, wenn man 'sudo pip' betreibt? Um das Python-Paket in Ihrem Home-Verzeichnis zu installieren, benötigen Sie keine Root-Rechte. Siehe Beschreibung der --userOption zum Pip.

Piotr Dobrogost
quelle
Obwohl Ihre Lösung die erste war, die tatsächlich funktionierte, erstellte @throws_exceptions_at_you eine Antwort mit aktuellem Code und keine Weiterleitung zur Dokumentation
Edenshaw,
Ich kannte sudo pip installkeine Schäden bei der Verwendung. Wie kann ich diesen Befehl oder diese Blockierung rückgängig machen, um sie auszuführen sudo?
Emre Değirmenci
26

Ihr ursprüngliches Problem ist, dass pip die Protokolle nicht in den Ordner schreiben kann.

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

Sie müssen in einen Ordner cd, in den der aufgerufene Prozess so schreiben kann, /tmpdass ein cd /tmperneuter Aufruf des Befehls wahrscheinlich funktioniert, aber nicht das ist, was Sie wollen.

ABER tatsächlich für diesen speziellen Fall (Sie möchten nicht sudofür die Installation von Python-Paketen verwenden) und keine Notwendigkeit für globale Paketinstallationen können Sie das --userFlag wie folgt verwenden:

pip install --user <packagename>

und es wird gut funktionieren.

Ich gehe davon aus, dass Sie eine Python-Python-Installation für einen Benutzer haben und sich nicht mit dem Lesen von virtualenv (was nicht sehr benutzerfreundlich ist) oder pipenv beschäftigen möchten .

Wie einige Leute im Kommentarbereich darauf hingewiesen haben, ist der nächste Ansatz keine sehr gute Idee, es sei denn, Sie wissen nicht, was Sie tun sollen, und stecken fest:

Ein anderer Ansatz für globale Pakete wie in Ihrem Fall möchten Sie etwas tun wie:

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

oder allgemeiner

chown -R $USER <path to your global pip packages>
wirft_exceptions_at_you
quelle
9
-1 Das Ändern des Besitzers des globalen Ordners für Site-Pakete ist eine schreckliche Sache. Die --userOption für pip wurde als Lösung in meiner Antwort angegeben, die bereits vorhanden war, als Sie Ihre geschrieben haben.
Piotr Dobrogost
1
Ich sehe hier kein Argument. Auch angesichts der Tatsache, dass jemand, der eine solche Einstiegsfrage stellt, wahrscheinlich nicht mit dem Unix-Berechtigungssystem vertraut ist und daher eine 1-Benutzer-Installation ausführt, spielt dies keine Rolle. Auch Ihre Antwort geht nicht auf den Anwendungsfall ein, in dem ich tatsächlich auf globale Pakete installieren möchte. Danach konnte ich die Berechtigungen problemlos auf die Vorinstallation zurücksetzen.
wirft_exceptions_at_you
2
+1 für das tatsächliche Schreiben der gesamten Befehle. Einige Leute gehen davon aus, dass das OP weiß, wie eine Option in der Befehlszeile implementiert wird , wenn sie oder andere Leser dies möglicherweise nicht tun. Stimmen Sie nicht zu, @PiotrDobrogost?
Lassen Sie mich darüber basteln
Hinzufügen --userhilft mir!
Honghao Zhang
2
Das Ändern der Berechtigungen für das gesamte site-packagesVerzeichnis von Python ähnelt dem "Reparieren" einer Pumpe durch Schlagen mit einem Schraubenschlüssel. Es ist aus einem bestimmten Grund geschützt - Sie sollten dort nichts installieren . Die wirkliche Lösung besteht nicht darin, die Python-Verteilung des Systems mit der täglichen Programmierung zu mischen. Installieren Sie eine andere Python-Distribution (von Python.org, Homebrew, Canopy usw.).
Charlesreid1
9

Da ich das gleiche Problem hatte, möchte ich betonen, dass der erste Kommentar von Brian Cain die Lösung für das Problem "IOError: [Errno 13]" ist:

Bei Ausführung im temporären Verzeichnis ( cd /tmp) tritt der IOError nicht mehr auf, wenn ich ihn ausführe sudo pip install foo.

Edgar
quelle
2
Gibt es eine Chance, dass Sie erklären können, warum dies das Problem für Sie löst?
Chris
8
Sie verwenden immer noch sudo pipdiese "Lösung" und installieren daher Pakete mit Root-Rechten. Was ist wahrscheinlich nicht das, was Sie wollen?
Chris
Ich kann nur raten, warum dies funktioniert: Ich denke, dass ein Teil von (einigen) Pip-Installationsskripten Schreibzugriff auf das aktuelle Verzeichnis erfordert, jedoch mit einem anderen Benutzer. Wenn es in Ihrem Home-Verzeichnis ausgeführt wird, schlägt es daher auf mysteriöse Weise fehl, da kein Schreibzugriff besteht. Wenn es von innen aufgerufen wird /tmp, funktioniert es, weil jeder dort Schreibzugriff hat.
Edgar
Er hat keinen Schreibzugriff auf '/Users/markwalker/Library/Logs/pip.log'
throw_exceptions_at_you
5

Ich hatte ein Problem bei der Installation virtualenvwrappernach erfolgreicher Installation virtualenv.

Mein Terminal hat sich danach beschwert:

pip install virtualenvwrapper

Also habe ich dies erfolglos versucht (NICHT EMPFOHLEN) :

sudo pip install virtualenvwrapper

Dann habe ich es erfolgreich damit installiert:

pip install --user virtualenvwrapper
Lass mich darüber basteln
quelle
Die Option --user für pip wurde als Lösung in meiner Antwort angegeben, die bereits vorhanden war, als Sie Ihre geschrieben haben. Dies sollte ein Kommentar sein, keine Antwort.
Piotr Dobrogost
Sie sagen NICHT empfohlen, aber offizielle Installationshinweise sagen OK, um virtualenvwrapper mit sudo zu installieren. Gleiches gilt für virtualenv. Die hier gestellte Frage bezieht sich nicht auf diese beiden, daher gehe ich davon aus, dass alle anderen Antworten hier für allgemeine Python-Pakete gelten.
Mehmet
Für zukünftige Leser habe ich aufgrund des obigen Kommentars meine "nicht empfohlene" Flagge in meiner Antwort durchgestrichen, aber ich habe sie noch nicht überprüft. Deshalb habe ich die Flagge noch nicht gelöscht.
Lassen Sie mich darüber basteln
4

Es sieht so aus, als wären Ihre Berechtigungen durcheinander. Geben Sie chown -R markwalker ~das Terminal ein und versuchen Sie es piperneut? Lassen Sie mich wissen, wenn Sie sortiert sind.

hd1
quelle
Dies kann zwar das Berechtigungsproblem lösen, beantwortet jedoch nicht die Frage.
Burhan Khalid
1
Das Lösen von Problemen, von denen ich nicht wusste, dass ich sie habe, ist ein Bonus! chowngibt Operation not permittedauf viele versteckte Verzeichnisse wie .shsh& ich nehme an, es funktioniert durch Dateien, die es jetzt setzen kann, aber ich werde sehen, was passiert, wenn die cli-Eingabeaufforderung zurückkehrt.
markwalker_