python - 如何强制嵌入式 python 使用与命令行一相同的 sys.path?

标签 python c++

我在 Ubuntu 16 C++ 应用程序中使用 python 作为嵌入式脚本语言。我使用 pip 安装附加模块(mysqlregex 等)。这些模块在命令行 python 中运行良好。但是,嵌入式 python 无法加载它们。原因是嵌入式python的sys.path和命令行的不一样。命令行 python sys.path 如下:

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

这里的/usr/lib/python2.7/dist-packagespip安装模块的路径。

嵌入式python sys.path如下:

/usr/lib/python2.7/
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload

当然,可以在 C++ 应用程序中对 pip 目录进行硬编码,并使用硬编码参数调用 PySys_SetPath。但是,这种方式对我来说很糟糕;这将使应用程序不可移植(我为 Ubuntu、CentOS 和 Windows 编译相同的代码)。

命令行 python 以某种方式“知道”pip 存储模块的位置。因此,任何配置文件都包含这些附加路径。我运行 printenv,但没有环境变量包含 /usr/lib/python2.7/dist-packages 字符串。一种方法是通过命令行 python 运行诊断脚本并将其输出发送到 PySys_SetPath。但是,是否有任何官方的、记录在案的方法来获取 python 安装通过调用 API 而不是通过运行外部进程搜索模块的所有路径

最佳答案

如果数据、脚本和/或可执行文件包含在包中,它们将安装在(它们的默认)单独目录中,而不是与 Python 文件一起安装。

此命令应该可以正常工作,但无法包含包的其他文件(如果有的话)。要包含任何数据、脚本或可执行文件,请使用 --prefix--install-data--install-scripts也称为 alternate installation .

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

要永久更改路径,请编辑 ~/.pip/pip.conf 文件以包括:

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

我强烈推荐pip wheel .它通过以下方面提供了对软件包安装的更多控制:设置要求、构建、安装顺序等;文档兴趣点:examples , controlling setup_requires , 和 using environment variables这可能是最简单的。

pip wheel 需要注意的一件事是:

You have to use the POSIX format for variable names including brackets around the uppercase name as shown in this example: ${API_TOKEN}. pip will attempt to find the corresponding environment variable defined on the host system at runtime.

关于python - 如何强制嵌入式 python 使用与命令行一相同的 sys.path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51762408/

相关文章:

python - 使用 Python 抓取 Google - requests.get 的正确 URL 是什么?

c++ - 将 (const) char * 转换为 LPCWSTR

c++ - 为什么这个函数指针的可变参数模板参数推导失败?

C++:使用带尖括号的#include <>放置文件的位置

python - PayPal 不返回授权 ID

python - 用Python对cos进行系列展开

python - Pytest 不在终端窗口中显示测试结果

python - Pandas GroupBy 列名

c++ - 使用 std::vector 的稀疏矩阵性能低下

c++ - C++ 的 Anagram 生成器(不使用 STL)