Python pip指定库目录和包含目录。

95

我使用pip尝试安装名为pyodbc的Python模块,该模块具有一些依赖于非Python库(如unixodbc-dev、unixodbc-bin、unixodbc)的依赖项。目前,我无法在系统范围内安装这些依赖项,因为我只是在玩耍,所以我已将它们安装在非标准位置。如何告诉pip在哪里查找这些依赖关系?更准确地说,如何通过pip传递包含目录(gcc -I)和库目录(gcc -L -l)的信息,以在构建pyodbc扩展时使用?


Python是否使用--user选项安装? - Bryan
8个回答

128

pip有一个--global-option标志。

您可以使用它来传递额外的标志给build_ext
例如,要添加一个--library-dirs (-L)标志:
pip install --global-option=build_ext --global-option="-L/path/to/local" pyodbc

gcc也支持环境变量:http://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html

我找不到任何关于build_ext的文档,所以这里是命令行帮助。

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

2
我希望这个文档能更好一些。对我来说,这几乎是唯一有效的方法,使用静态编译的ATLAS安装scikit-learn,并结合这里所描述的选项规范。 - Praveen
3
我发现--install-option也可以用来指定库路径,而不仅仅是--global-option。但我不确定在什么情况下应该使用其中之一。也许--install-option只适用于安装,而--global-option具有更广泛的范围。另请参见https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-install-option。 - snark
如果您想要包含多个库或包含目录,它们应该用分号而不是冒号分隔。 - Totomobile
我想知道是否有一种方法可以指定一个相对于PIP临时创建的构建目录的路径。 - Kentzo
如果你想知道如何获取命令行帮助,请在包含setup.py文件的目录中运行python setup.py build_ext --help - snark
--global-option现已被弃用,是否可以使用--config-settings来完成此操作?https://pip.pypa.io/en/stable/news/#v23-1 - Adam Stewart

39

在Thorfin的回答的基础上,并假设您期望的包含和库位置在/usr/local中,您可以通过以下方式同时传递两者:

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

24

在运行pip之前,设置相关的环境变量来指示包含文件和库的位置,例如:

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

哇,这真是太棒了;它还在执行 python setup.py buildpython setup.py bdist_wheel 时有帮助! - Tomasz Gandor
在我的情况下,我还需要添加 CFLAGS=-I/usr/local/opt/...../include - Robert Lujo

13

提醒一下...如果您在使用pip安装软件包时遇到问题,您可以使用

--no-clean选项查看发生了什么(即,为什么构建失败)。例如,如果numpy未能正确安装,您可以尝试:

pip install --no-clean numpy

然后查看临时文件夹以查看构建进展情况。在Windows机器上,它的位置可能像这样:

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

请注意,--no-clean选项会尝试安装软件包,但不会清理自身,从而让您了解pip正在尝试做什么。

否则,如果您只想下载源代码,则可以使用-d标志。例如,要将NumPy源代码的.tar文件下载到当前目录,请使用:

pip install -d %cd% numpy

5

我也受到Thorfin回答的帮助;我正在Windows上构建GTK3+并安装pygobject,但我在如何使用pip install包含多个文件夹方面遇到了困难。

我尝试根据pip文档创建pip配置文件,但失败了。现在可以用命令行工具解决:

pip install --global-option=build_ext --global-option="-IlistOfDirectories" 
# and/or with:  --global-option="-LlistofDirectories"

在Windows中,用于多个文件夹的分隔符是“;”分号,而不是冒号“:”,在其他操作系统中可能会有所不同。
示例工作命令行:
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

您可以使用''或'/'作为路径分隔符,但请确保不要在双引号后面输入反斜杠。

下面的示例将失败,因为双引号后面有反斜杠。

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

Windows路径怎么样?默认是什么,如何编写它们? - not2qubit

0

-1

你有使用过virtualenv吗?它是一个Python包,可以让你在一台机器上创建和维护多个隔离的环境。每个环境都可以独立于其他环境使用不同的模块,而不会破坏系统库或单独虚拟环境中的依赖关系。

如果你没有root权限,你可以从源代码下载并使用virtualenv包

$ 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

我上周末在Ubuntu Server 12.0.4上按照以上步骤操作,一切都很完美。每个新创建的虚拟环境默认都带有PIP,因此在新环境中安装软件包非常容易。


詹姆斯,确实。在我的回答中,我应该指出我也使用了 virtualenv。 - Cricri
7
这并没有帮助,因为楼主明确表示他们需要安装非Python库(即向编译器/链接器传递参数)。我实际上也是同样的情况,有点沮丧的是,对于这个问题的每三个回答中就有一个是“使用virtualenv”,因为(虽然我认为virtualenv是一个很好的工具),但它并不能真正解决这个问题。 - gred
@gred,在仔细查看问题后,我同意...virtualenv在这里不是正确的解决方案。看起来OP通过使用setup.py找到了一个解决方法。 - nicholsonjf
我不确定这如何远程帮助OP。这看起来像是使用virtualenv的推销。 - vivekv
如果您读了您之前发表评论的评论,您会看到这个观点已经被我提出并随后被我确认。 - nicholsonjf

-2

如果有人需要帮助,我想提醒一下,我仍然找不到通过pip安装的方法,所以最终只能下载该软件包并通过其“setup.py”进行操作。同时,我转而使用了一个更容易安装的API,名为“pymssql”。


2
你是如何将 setup.py 指向非标准位置中已安装的依赖项的? - nicholsonjf
像这样 python setup.py build_ext --rpath=/usr/local/lib - yota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接