python pip 指定一个库目录和一个包含目录

Posted

技术标签:

【中文标题】python pip 指定一个库目录和一个包含目录【英文标题】:python pip specify a library directory and an include directory 【发布时间】:2013-09-17 23:14:57 【问题描述】:

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

【问题讨论】:

是否使用--user 选项安装了python? 【参考方案1】:

以防万一它对某人有帮助,我仍然找不到通过 pip 完成的方法,所以最后只是下载了包并通过它的“setup.py”来完成。还切换到似乎更容易安装的 API,称为“pymssql”。

【讨论】:

如何将 setup.py 指向安装在非标准位置的依赖项? 喜欢这个python setup.py build_ext --rpath=/usr/local/lib ?【参考方案2】:

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

如果你没有root权限,可以download and use the virtualenv package from source:

$ 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。 这并没有真正的帮助,因为 OP 明确指出他们需要安装非 python 库(即将 args 传递给编译器/链接器)。我实际上在同一条船上,我有点沮丧,这个问题的每三个答案都是“使用 virtualenv”,因为(虽然我同意 virtualenv 是一个很棒的工具)它并没有真正解决这个问题。 @gred,在仔细研究了这个问题后,我同意......virtualenv 在这里不是正确的解决方案。看起来 OP 通过使用 setup.py 找到了解决方法。 我不确定这如何远程帮助 OP。这看起来像是使用 virtualenv 的宣传 @vivekv 如果您之前阅读过 cmets,您会发现这一点已经提出并随后得到了我的认可【参考方案3】:

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

【讨论】:

我希望有更好的记录。这几乎是唯一对我有用的东西,针对静态编译的 ATLAS 安装 scikit-learn,并结合 here 所述的选项规范 我发现--install-option 也可以代替--global-option 用于指定库的路径。我不确定什么时候应该使用一个而不是另一个。也许--install-option 只适用于安装,--global-option 的范围更广。另见pip.pypa.io/en/stable/reference/pip_install/… 如果要包含多个库或包含目录,它们之间用 semi-冒号分隔,而不是冒号。 我想知道是否有一种方法可以指定相对于 PIP 在运行时临时创建的构建目录的路径。【参考方案4】:

仅供参考...如果您在使用 pip 安装软件包时遇到问题,那么您可以使用

--no-clean 选项来查看到底发生了什么(也就是说,为什么构建没有工作)。例如,如果 numpy 没有正确安装,您可以尝试

pip install --no-clean numpy

然后查看 Temporary 文件夹以了解构建的进度。在 Windows 机器上,它应该位于以下位置:

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

为了清楚起见,--no-clean 选项会尝试安装软件包,但不会自行清理,让您看到 pip 尝试执行的操作。

否则,如果您只想下载源代码,那么我会使用-d 标志。例如,要将 Numpy 源代码 .tar 文件下载到当前目录,请使用:

pip install -d %cd% numpy

【讨论】:

【参考方案5】:

以 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>

【讨论】:

【参考方案6】:

另一种指示包含文件和库位置的方法是在运行 pip 之前设置相关的环境变量,例如

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

【讨论】:

【参考方案7】:

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 路径呢?什么是默认值以及如何编写它们?

以上是关于python pip 指定一个库目录和一个包含目录的主要内容,如果未能解决你的问题,请参考以下文章

pip 安装库时临时指定豆瓣源

pip/matplot/pandas的安装和使用

如何使用 pip 从 git 子目录安装?

python opencv安装教程 通过pip安装三方库

简单的python库无法安装

python conda 环境变量 pip默认安装目录