Installieren Sie ein Python-Paket mit pip in einem anderen Verzeichnis?

432

Ich weiß, dass die offensichtliche Antwort darin besteht, virtualenv und virtualenvwrapper zu verwenden, aber aus verschiedenen Gründen kann / will ich das nicht.

Wie ändere ich den Befehl?

pip install package_name

pipum das Paket an einem anderen Ort als dem Standard zu installieren site-packages?

Monika Sulik
quelle
2
Verwandte Themen
Piotr Dobrogost
2
Nun Frage Nummer zwei: Wenn Sie bereits in einem benutzerdefinierten Verzeichnis installieren, pipversuchen Sie NICHT, eine ältere Version aus einem nicht benutzerdefinierten Verzeichnis zu entfernen. Zum Beispiel - ein systemweites, bei dem Sie keine Schreibberechtigungen haben. Bisher habe ich das nur mit easy_install...
Tomasz Gandor
2
@TomaszGandor Ich denke, die Verwendung der --ignore-installedOption sollte verhindern, dass pip versucht, bereits installierte Pakete zu deinstallieren.
Piotr Dobrogost
Es tut mir leid, dass ich neu bei pip bin, aber ist Ihre Frage die gleiche wie die Frage, wie pi auf einer anderen Version von Python installiert werden soll? Ich habe Python 3.4 und 3.5, aber ich möchte, dass meine Pip-Installationen zu Python 3.5 gehen.
Charlie Parker
@ Charlie Nope, andere Frage. Ich weiß nicht genug über Ihre Installation / Absichten, aber im Allgemeinen würde ich wahrscheinlich virtualenvwrapper verwenden und eine virtuelle Umgebung mit so etwas wiemkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Antworten:

334

Verwenden:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

Möglicherweise möchten Sie auch verwenden --ignore-installed, um die Neuinstallation aller Abhängigkeiten mit diesem neuen Präfix zu erzwingen. Sie können --install-optionmehrmals verwenden, um eine der Optionen hinzuzufügen, mit denen Sie verwenden können python setup.py install( --prefixwahrscheinlich möchten Sie, aber es gibt eine Reihe weiterer Optionen, die Sie verwenden können).

Ian Bicking
quelle
5
Wenn Sie dies tun, gibt es eine Möglichkeit, pip freezedas alternative Verzeichnis anzuzeigen?
Russ
7
pip freeze schaut auf den Pfad, also wenn du so etwas siehst, PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezesolltest du sie sehen.
Ian Bicking
4
Die Verwendung --prefix=$PREFIX_PATHscheint keine vollständige Kontrolle über das Installationsverzeichnis zu ermöglichen, da ein systemspezifisches Suffix daran angehängt wird ( \Lib\site-packagesz. B. unter Windows). Gibt es eine Möglichkeit, ein bestimmtes Verzeichnis anzugeben?
Piotr Dobrogost
1
@Piotr: Ja, da ist meine Antwort. Die Verwendung von '--prefix' ist etwas grob, funktioniert aber gut, wenn Sie möchten, dass Ihre reine Python unter /usr/lib/pythonX.Y/site-packages anstelle von /usr/local/lib/pythonX.Y/site- Pakete.
Anthon
79
Keine schlechte Antwort vor 4 Jahren, aber die Option --target gibt es jetzt.
Tritium21
544

Der Schalter --target ist genau das, wonach Sie suchen:

pip install --target=d:\somewhere\other\than\the\default package_name

Sie müssen jedoch noch etwas hinzufügen d:\somewhere\other\than\the\default, PYTHONPATHum sie tatsächlich von diesem Speicherort aus verwenden zu können.

-t, --target <Verzeichnis>
Installiert Pakete in <Verzeichnis>. Standardmäßig werden vorhandene Dateien / Ordner in <dir> nicht ersetzt.
Verwenden Sie --upgrade, um vorhandene Pakete in <dir> durch neue Versionen zu ersetzen.


Aktualisieren Sie pip, wenn der Zielschalter nicht verfügbar ist:

Unter Linux oder OS X:

pip install -U pip

Unter Windows (dies umgeht ein Problem ):

python -m pip install -U pip
Janusz Skonieczny
quelle
8
@ DanH laufen pip install --upgrade pip!
r3m0t
16
Dies ist die wahre Antwort, es ist nur die Option, die ziemlich viel nach der akzeptierten Antwort hinzugefügt wurde.
Bukzor
5
Was ist der Unterschied zwischen --install-option="--prefix=$PREFIX_PATH"@Ian Bicking und der --target=$PATHOption?
Hibou57
6
targetist eine Pip-Option, und alles, was Sie eingeben, install-optionwird an die weitergeleitet setup.py install command. Grundsätzlich targetist benutzerdefinierte Site-Pakete Speicherort.
Janusz Skonieczny
10
Die Verwendung --targetkann zu einer Teilinstallation führen, da keine Skripte / Datendateien im angegebenen Präfix installiert werden. Es scheint, als wäre das Übergeben --prefixmit --install-optionder einzig richtige Weg, um die volle Kontrolle über das verwendete Installationspräfix zu haben.
Kenneth Hoste
73

Anstelle der --targetOption oder der --install-optionsOption habe ich festgestellt, dass Folgendes gut funktioniert (aus der Diskussion über einen Fehler in Bezug auf genau diese Sache unter https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Oder legen Sie das PYTHONUSERBASEVerzeichnis in Ihrer Umgebung fest, bevor Sie den Befehl ausführen. export PYTHONUSERBASE=/path/to/install/to)

Dies verwendet die sehr nützliche --userOption , aber sagt es das zu machen bin, lib, shareund andere Verzeichnisse werden Sie unter einem benutzerdefinierten Präfix erwarten , anstatt$HOME/.local .

Dann können Sie diese auf Ihre hinzufügen PATH, PYTHONPATHund andere Variablen wie ein normales Installationsverzeichnis.

Beachten Sie, dass Sie möglicherweise auch die Optionen --upgradeund angeben müssen, --ignore-installedwenn für Pakete, von denen dies abhängt, neuere Versionen im PYTHONUSERBASEVerzeichnis installiert werden müssen , um die vom System bereitgestellten Versionen zu überschreiben.

Ein vollständiges Beispiel:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..um die neuesten Versionen zu installieren scipyund numpyin ein Verzeichnis zu packen, das Sie dann in Ihr Verzeichnis aufnehmen können PYTHONPATH(in diesem Beispiel mit bash und für Python 2.6 unter CentOS 6):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

Die Verwendung von virtualenv ist immer noch eine bessere und sauberere Lösung!

David Gardner
quelle
4
Dies funktionierte mit Travis CI, das auf Docker-Containern ausgeführt wurde, während die Lösung --install-option = "- prefix = $ PREFIX_PATH" dies nicht tat.
32 Bits
1
Noobie Frage, wie wichtig der /binOrdner ist, den pip erstellt, --usererstellt ihn genauso wie er, --PREFIXwährend --targetdies nicht der Fall ist.
Jonathan
1
Wenn das Paket in globalem Python installiert --ignore-installedist , wird es benötigt.
George Sovetov
1
Diese Option ist auch mit --editablelokalen Installationen kompatibel .
mdh
1
Diese Option ist praktisch, um Pakete als Superuser für einen anderen Nicht-Root-Benutzer zu installieren, ohne herumlaufen zu müssen su(was beispielsweise in Containern problematisch sein kann).
mdh
43

Die Installation eines Python-Pakets enthält häufig nur einige reine Python-Dateien. Wenn das Paket Daten, Skripte und / oder ausführbare Dateien enthält, werden diese in anderen Verzeichnissen als die reinen Python-Dateien installiert.

Angenommen, Ihr Paket enthält keine Daten / Skripte / ausführbaren Dateien und Sie möchten, dass Ihre Python-Dateien in /python/packages/package_name(und nicht in ein Unterverzeichnis, das einige Ebenen tiefer liegt /python/packagesals bei der Verwendung --prefix), können Sie den einmaligen Befehl verwenden:

pip install --install-option="--install-purelib=/python/packages" package_name

Wenn Sie möchten, dass alle (oder die meisten) Ihrer Pakete dorthin gelangen, können Sie Ihre Pakete so bearbeiten, dass sie Folgendes ~/.pip/pip.confenthalten:

[install]
install-option=--install-purelib=/python/packages

Auf diese Weise können Sie nicht vergessen, dass Sie es immer wieder angeben müssen.

Alle im Paket enthaltenen excecutables / data / scripts werden weiterhin an ihren Standardpositionen gespeichert, es sei denn, Sie geben zusätzliche Installationsoptionen an ( --prefix/ --install-data/ --install-scriptsusw., Einzelheiten finden Sie in den benutzerdefinierten Installationsoptionen ).

Anthon
quelle
1
Ein großes Plus für die Konfigurationsdatei. Ich persönlich --prefixgebe das dort an, weil ich ein "lokales" Verzeichnis auf einem gemeinsam genutzten Server im Home-Verzeichnis habe und es als Präfix von verwendet wurde, easy_installbevor ich zu wechselte pip. System $PATHund $PYTHONPATHwurden zuvor konfiguriert. Stattdessen install-option=--install-purelib=/blahgibt es diese neuere target=/blahOption / Schalter. Es ist auch schön, aber manchmal brauchen Sie nur einen Ersatz für --prefix, den Sie mit setup.pyoder verwenden würden easy_install.
Tomasz Gandor
30

Um eine Bibliothek genau dort zu installieren, wo ich sie haben wollte, navigierte ich zu dem Ort, an dem ich das Verzeichnis mit dem dann verwendeten Terminal haben wollte

pip install mylibraryName -t . 

Die Logik, die ich von dieser Seite übernommen habe: https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download


quelle
11
-tist eine Abkürzung für--target
Jonathan
Dies war die einzige Lösung, die für mich funktioniert hat. (Windows 7)
Coliban
18

Niemand scheint die Option -t erwähnt zu haben, aber die einfachste:

pip install -t <direct directory> <package>
Erwan
quelle
8
Die -tOption ist die Kurzversion der --targetOption, die in einer anderen Antwort beschrieben wurde ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG
14

Fügen Sie einfach einen Punkt zur Antwort von @Ian Bicking hinzu:

Verwendung der --user Option zum Angeben des installierten Verzeichnisses funktioniert auch, wenn ein Python-Paket in seinem Home-Verzeichnis (ohne sudo-Benutzerrecht) auf dem Remote-Server installiert werden soll.

Z.B,

pip install --user python-memcached

Der Befehl installiert das Paket in einem der Verzeichnisse, die in Ihrem PYTHONPATH aufgeführt sind.

Guter Wille
quelle
14

Testete diese Optionen mit Python3.5 und Pip 9.0.3:

pip install --target / myfolder [Pakete]

Installiert ALLE Pakete einschließlich Abhängigkeiten unter / myfolder. Berücksichtigt nicht, dass abhängige Pakete bereits an anderer Stelle in Python installiert sind. Sie finden Pakete aus / myfolder / [Paketname]. Wenn Sie mehrere Python-Versionen haben, wird dies nicht berücksichtigt (keine Python-Version im Paketordnernamen).

pip install --prefix / myfolder [Pakete]

Prüfungen sind bereits installierte Abhängigkeiten. Installiert Pakete in /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [Pakete]

Überprüft Abhängigkeiten wie --prefix, aber der Installationsort lautet /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [Pakete]

Installiert Pakete in $ HOME: /home/[USER‹/.local/lib/python3.5/site-packages Python sucht automatisch von diesem .local-Pfad aus, sodass Sie es nicht auf Ihrem PYTHONPATH ablegen müssen.

=> In den meisten Fällen ist --user die beste Option. Falls der Home-Ordner aus irgendeinem Grund nicht verwendet werden kann, dann --prefix.

Mikko
quelle
Unter Python 2.7.16 installiert --target (oder --prefix) beispielsweise Jinja2-2.10.1.dist-info /, während install --install-option = "- Präfix Jinja2-2.10.1-py2 installiert .7.egg-info /, was ich eigentlich wollte
Greg Dougherty
13

Neuere Versionen von pip(8 oder höher) können die --prefixOption direkt verwenden :

pip install --prefix=$PREFIX_PATH package_name

Wo $PREFIX_PATHist das Installationspräfix, in dem sich lib, bin und andere Ordner der obersten Ebene befinden?

Mike T.
quelle
10
pip install packageName -t pathOfDirectory

oder

pip install packageName --target pathOfDirectorty
Kundan Kaushik
quelle
4

Um den bereits guten Rat zu ergänzen, da ich ein Problem bei der Installation von IPython hatte, für das ich keine Schreibberechtigung hatte/usr/local .

pip verwendet distutils, um seine Installation durchzuführen, und dieser Thread beschreibt , wie dies ein Problem verursachen kann, da es sich auf das stütztsys.prefix Einstellung .

Mein Problem trat auf, als die IPython-Installation versuchte, mit verweigerter Berechtigung in '/ usr / local / share / man / man1' zu schreiben . Da die Installation fehlschlug, schienen die IPython-Dateien nicht in das bin-Verzeichnis geschrieben zu werden.

Die Verwendung von "--user" funktionierte und die Dateien wurden in ~ / .local geschrieben. Das Hinzufügen von ~ / .local / bin zum $ PATH bedeutete, dass ich von dort aus "ipython" verwenden konnte.

Ich versuche jedoch, dies für eine Reihe von Benutzern zu installieren, und habe die Schreibberechtigung für das /usr/local/lib/python2.7Verzeichnis erhalten. Ich habe dort ein "bin" -Verzeichnis erstellt und Anweisungen für distutils festgelegt:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

dann ( -Iwird verwendet, um die Installation trotz vorheriger Fehler / lokaler Installation zu erzwingen):

pip install -I ipython

Dann habe ich /usr/local/lib/python2.7/binzu $PATH.

Ich dachte, ich würde dies einschließen, falls jemand andere ähnliche Probleme auf einem Computer hat, auf den er keinen Sudo-Zugriff hat.

Stuart Brock
quelle
2

Wenn Sie Brew mit Python verwenden, wird pip / pip3 leider mit sehr begrenzten Optionen ausgeliefert. Sie haben nicht die oben genannten Optionen --install-option, --target, --user.

Hinweis zur Pip-Installation --user
Die normale Pip-Installation --user ist für gebrautes Python deaktiviert. Dies liegt an einem Fehler in distutils, da Homebrew eine distutils.cfg schreibt, die das Paketpräfix festlegt. Eine mögliche Problemumgehung (die ausführbare Skripte in ~ / Library / Python /./ bin ablegt) ist: python -m pip install --user --install-option="--prefix=" <package-name>

Diese Zeile ist möglicherweise sehr umständlich. Ich schlage vor, Pyenv für das Management zu verwenden. Wenn Sie verwenden

brew upgrade python python3

Ironischerweise stufen Sie die Pip-Funktionalität tatsächlich herab.

(Ich poste diese Antwort, einfach weil pip in meinem Mac OSX keine Option --target hat und ich Stunden damit verbracht habe, sie zu reparieren.)

anonym
quelle
Diese Antwort mit einem expliziten Präfix und ignore-installedaufgrund früherer Bemühungen funktionierte für mich:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones
0

Mit pip v1.5.6on Python v2.7.3(GNU / Linux) können Sie mit der Option --root(anscheinend) ein globales Installationspräfix angeben, unabhängig von den Optionen eines bestimmten Pakets. Versuchen Sie es mit fi,

$ pip install --root=/alternative/prefix/path package_name
Sphakka
quelle
0

Ich schlage vor, der Dokumentation zu folgen und die Datei ~ / .pip / pip.conf zu erstellen. Beachten Sie, dass in der Dokumentation das angegebene Header-Verzeichnis fehlt, was zu folgendem Fehler führt:

error: install-base or install-platbase supplied, but installation scheme is incomplete

Der vollständige Arbeitsinhalt der conf-Datei lautet:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Leider kann ich installieren, aber wenn ich versuche, pip zu deinstallieren, wird mir mitgeteilt, dass es kein solches Paket für den Deinstallationsprozess gibt. Es stimmt also immer noch etwas nicht, aber das Paket wird an seinen vordefinierten Speicherort verschoben.

Kensai
quelle
0

pip install /path/to/package/

ist jetzt möglich.

Der Unterschied zu diesem und der Verwendung des Flags -eoder --editablebesteht darin, dass -eLinks zu dem Speicherort des Pakets (dh Ihrem Download-Ordner) vorhanden sind, anstatt es in Ihrem Python-Pfad zu installieren.

Das heißt, wenn Sie das Paket löschen / in einen anderen Ordner verschieben, können Sie es nicht verwenden.

AH
quelle
Dies beantwortet die Frage nicht
Clintm