Python Pip gibt ein Bibliotheksverzeichnis und ein Include-Verzeichnis an

73

Ich verwende pip und versuche, ein Python-Modul namens pyodbc zu installieren, das einige Abhängigkeiten von Nicht-Python-Bibliotheken wie unixodbc-dev, unixodbc-bin, unixodbc aufweist. Ich kann diese Abhängigkeiten derzeit nicht systemweit installieren, da ich nur spiele. Daher habe ich sie an einem nicht standardmäßigen Speicherort installiert. Wie kann ich pip mitteilen, wo nach diesen Abhängigkeiten gesucht werden soll? Genauer gesagt, wie übergebe ich Informationen über pip von Include-Verzeichnissen (gcc -I) und Bibliotheksverzeichnissen (gcc -L -l), die beim Erstellen der pyodbc-Erweiterung verwendet werden sollen?

Cricri
quelle
Wurde Python mit der --userOption installiert ?
Bryan

Antworten:

99

pip hat eine --global-optionFlagge

Sie können es verwenden, um zusätzliche Flags an zu übergeben build_ext.
So fügen Sie beispielsweise ein Flag --library-dirs (-L) hinzu:
pip install --global-option=build_ext --global-option="-L/path/to/local" pyodbc

gcc unterstützt auch Umgebungsvariablen: http://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html

Ich konnte keine build_ext-Dokumentation finden. Hier ist die Befehlszeilenhilfe

Options for 'build_ext' command:
  --build-lib (-b)     directory for compiled extension modules
  --build-temp (-t)    directory for temporary files (build by-products)
  --plat-name (-p)     platform name to cross-compile for, if supported
                       (default: linux-x86_64)
  --inplace (-i)       ignore build-lib and put compiled extensions into the
                       source directory alongside your pure Python modules
  --include-dirs (-I)  list of directories to search for header files
                       (separated by ':')
  --define (-D)        C preprocessor macros to define
  --undef (-U)         C preprocessor macros to undefine
  --libraries (-l)     external C libraries to link with
  --library-dirs (-L)  directories to search for external C libraries
                       (separated by ':')
  --rpath (-R)         directories to search for shared C libraries at runtime
  --link-objects (-O)  extra explicit link objects to include in the link
  --debug (-g)         compile/link with debugging information
  --force (-f)         forcibly build everything (ignore file timestamps)
  --compiler (-c)      specify the compiler type
  --swig-cpp           make SWIG create C++ files (default is C)
  --swig-opts          list of SWIG command line options
  --swig               path to the SWIG executable
  --user               add user include, library and rpath
  --help-compiler      list available compilers
Thorfin
quelle
2
Ich wünschte, dies wäre besser dokumentiert. Dies war so ziemlich das einzige, was für mich funktioniert hat: Scikit-Learn gegen ein statisch kompiliertes ATLAS zu installieren, kombiniert mit der hier
Praveen,
1
Ich fand --install-optionauch funktioniert, anstatt --global-optionPfade zu Bibliotheken anzugeben. Ich bin mir nicht sicher, wann einer verwendet werden soll und nicht der andere. --install-optionGilt möglicherweise nur für die Installation und --global-optionhat einen größeren Anwendungsbereich. Siehe auch pip.pypa.io/en/stable/reference/pip_install/…
Snark
Wenn Sie mehrere Bibliotheken oder Include - Verzeichnisse aufgenommen werden sollen, werden sie von einem getrennt halb -colon, kein Doppelpunkt.
Totomobile
25

Aufbauend auf Thorfins Antwort und unter der Annahme, dass sich Ihre gewünschten Include- und Bibliotheksstandorte in / usr / local befinden, können Sie beide wie folgt übergeben:

sudo pip install --global-option=build_ext --global-option="-I/usr/local/include/" --global-option="-L/usr/local/lib"  <you package name>
Viathon
quelle
12

Nur zu Ihrer Information ... Wenn Sie Probleme bei der Installation eines Pakets mit pip haben, können Sie das verwenden

--no-cleanOption, um zu sehen, was genau los ist (das heißt, warum der Build nicht funktioniert hat). Wenn numpy beispielsweise nicht ordnungsgemäß installiert wird, können Sie es versuchen

pip install --no-clean numpy

Sehen Sie sich dann den temporären Ordner an, um zu sehen, wie weit der Build gekommen ist. Auf einem Windows-Computer sollte sich Folgendes befinden:

C:\Users\Bob\AppData\Local\Temp\pip_build_Bob\numpy

Um ganz klar zu sein, versucht die Option --no-clean, das Paket zu installieren, bereinigt jedoch nicht nach sich selbst, sodass Sie sehen können, was pip versucht hat.

Andernfalls würde ich das -dFlag verwenden , wenn Sie nur den Quellcode herunterladen möchten . Verwenden Sie beispielsweise Folgendes, um die Numpy-Quellcodedatei .tarin das aktuelle Verzeichnis herunterzuladen :

pip install -d %cd% numpy
bremen_matt
quelle
9

Eine andere Möglichkeit, den Speicherort von Include-Dateien und Bibliotheken anzugeben, besteht darin, relevante Umgebungsvariablen festzulegen, bevor pip ausgeführt wird, z

export LDFLAGS=-L/usr/local/opt/openssl/lib
export CPPFLAGS=-I/usr/local/opt/openssl/include
pip install cryptography
Huy Le
quelle
3

Mir half auch Thorfins Antwort; Ich habe GTK3 + unter Windows erstellt und pygobject installiert. Ich hatte Schwierigkeiten, mehrere Ordner in die Pip-Installation aufzunehmen.

Ich habe versucht, eine Pip-Konfigurationsdatei gemäß der Pip-Dokumentation zu erstellen. aber scheiterte. Derjenige, der arbeitet, ist mit der Kommandozeile:

--global-option = build_ext gefolgt von --global-option = "- IlistOfDirectories" und / oder --global-option = "- LlistofDirectories"

Das Trennzeichen, das mit mehreren Ordnern in Windows funktioniert, ist ';' Semikolon , NICHT Doppelpunkt ':' In anderen Betriebssystemen kann dies anders sein.

Beispiel für eine Arbeitsbefehlszeile:

pip install --global-option=build_ext --global-option="-Ic:/gtk-build/gtk/x64/release/include;d:/gtk-build/gtk/x64/release/include/gobject-introspection-1.0" --global-option="-Lc:\gtk-build\gtk\x64\release\lib" pygobject==3.27.1

Sie können '\' oder '/' als Pfad verwenden, aber stellen Sie sicher, dass Sie keinen Backslash neben "

Dies wird fehlschlagen, da neben dem doppelten Anführungszeichen ein Backslash steht

pip install --global-option=build_ext --global-option="-Ic:\willFail\" --global-option="-Lc:\willFail\" pygobject==3.27.1
Drachen
quelle
0

Haben Sie schon einmal virtualenv verwendet ? Mit diesem Python-Paket können Sie mehrere isolierte Umgebungen auf einem Computer erstellen und verwalten. Jedes kann verschiedene Module unabhängig voneinander verwenden, ohne Abhängigkeiten in Ihrer Systembibliothek oder einer separaten virtuellen Umgebung zu vermasseln.

Wenn Sie keine Root-Rechte haben, können Sie das virtualenv-Paket von der Quelle herunterladen und verwenden :

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-X.X.tar.gz
$ tar xvfz virtualenv-X.X.tar.gz
$ cd virtualenv-X.X
$ python virtualenv.py myVE

Ich habe dieses Wochenende die obigen Schritte unter Ubuntu Server 12.0.4 ausgeführt und es hat perfekt funktioniert. Jede neue virtuelle Umgebung, die Sie erstellen, wird standardmäßig mit PIP geliefert, sodass die Installation von Paketen in Ihrer neuen Umgebung einfach ist.

James Nicholson
quelle
James in der Tat. In der Antwort, die ich gegeben habe, hätte ich angeben sollen, dass ich auch virtualenv verwendet habe.
Cricri
6
Dies hilft nicht wirklich, da das OP klar angegeben hat, dass Nicht-Python-Bibliotheken installiert werden müssen (dh Argumente an den Compiler / Linker übergeben). Ich bin tatsächlich im selben Boot und ein wenig frustriert darüber, dass jede dritte Antwort auf diese Frage "use virtualenv" lautet, da (obwohl ich der Meinung bin, dass virtualenv ein großartiges Tool ist) dieses Problem nicht wirklich angegangen wird.
Gred
@gred, nach genauerer Betrachtung der Frage stimme ich zu ... virtualenv ist hier nicht die richtige Lösung. Es sieht so aus, als hätte das OP mithilfe von setup.py eine Problemumgehung gefunden.
James Nicholson
Ich bin mir nicht sicher, wie dies dem OP aus der Ferne hilft. Dies sieht aus wie ein Pitch für die Verwendung von virtualenv
vivekv
@vivekv Wenn Sie die Kommentare vor Ihren gelesen hätten, würden Sie sehen, dass dieser Punkt bereits gemacht und anschließend von mir bestätigt wurde
James Nicholson
-3

Nur für den Fall, dass es jemandem hilft, konnte ich immer noch keinen Weg finden, dies über pip zu tun. Am Ende lud ich einfach das Paket herunter und tat es über die 'setup.py'. Auch auf eine scheinbar einfacher zu installierende API namens 'pymssql' umgestellt.

Cricri
quelle
2
Wie haben Sie setup.py auf die Abhängigkeiten verwiesen, die Sie am nicht standardmäßigen Speicherort installiert haben?
James Nicholson
so python setup.py build_ext --rpath=/usr/local/lib?
Yota