【发布时间】:2011-07-16 03:54:17
【问题描述】:
我有一个动态链接到 Python 解释器的 C++ 应用程序。我希望能够从特定目录导入 python 模块。我想为我的进程修改 PYTHONPATH,以便 sys.path 将包含我添加到 PYTHONPATH 的路径。根据本文档,这似乎是它的工作方式:
http://docs.python.org/c-api/intro.html#embedding-python
但是,当我从 Python-land 打印 sys.path 时,它具有 PYTHONPATH 的原始内容,而不是我设置的内容。这是我正在做的一个例子(使用 Boost.Python):
int main(int argc, char* argv[])
{
_putenv_s("PYTHONPATH", "C:\\source\\\\modules");
Py_Initialize();
object main = import("__main__");
object global = (main.attr("__dict__"));
exec("import sys\nprint sys.path"), global, global);
}
PS - 我知道还有其他方法可以实现我的目标,但这不是我要问的。我想知道为什么 Py_Initialize() 在设置 sys.path 时不使用 PYTHONPATH 的当前值。还是我误解了它应该如何工作?
【问题讨论】:
-
看起来应该可以了。 (尽管您可能希望在源代码和模块之间使用 2 个,而不是 4 个反斜杠。) sys.path 的值打印什么?
-
['C:\\source\\test','C:\\windows\\system32\\python27.zip', 'C:\\Python27\\Lib', 'C: \\Python27\\DLLs', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages'] 请注意我的系统 PYTHONPATH 设置为 C:\source\test,我的代码将其更改为 C:\source\modules。所以,sys.path 正在获取原始值。
-
您是否检查过
_putenv_s是否成功,即返回0? -
奇怪。假设您确实成功地更改了它们,我看不到嵌入式 python 解释器如何在您在此过程中更改它们之前看到环境变量。 2 种不太可能的可能性:putenv 失败,或者 putenv 仅影响环境的 CRT 副本,并且 Python 解释器正在使用由 SetEnvironmentVariable 维护的单独的 Win32 环境副本。 lists.boost.org/Archives/boost/2002/01/23504.php 说 putenv 应该改变两者,但是尝试 SetEnvironmentVariable 看看它是否有帮助?
-
既然是嵌入Python,应该可以直接调整sys.path,完全不用环境变量的方法。
标签: c++ python boost-python python-c-api python-embedding