gpt4 book ai didi

python - 为什么在从 C 应用程序导入 Python 脚本时需要将 os.getcwd() 显式添加到 sys.path?

转载 作者:行者123 更新时间:2023-11-28 22:59:22 25 4
gpt4 key购买 nike

我正在浏览有关 Extending Python with C/C++ 的 Python 文档,我发现了一个非常有趣的场景。假设我的工作目录中有以下名为 test_script.py 的简单 Python 脚本:

import time
def My_Python_Func():
print "My_Python_Func() Called: " + str(time.time())

在同一目录中,我有一个名为 another_test_script.py 的文件,其中包含:

import test_script
test_script.My_Python_Func()

当以 python ./another_test_script.py 调用时,效果很好。现在,我正尝试从与 Python 库链接的 C 环境中调用所述函数,如下所示:

#include <stdio.h>
#include <Python.h>

PyObject *pName, *pModule, *pDict, *pFunc, *pVal;

int main()
{
const char* script_name = "test_script";
const char* func_name = "My_Python_Func";

Py_Initialize();

pName = PyString_FromString(script_name);

PyRun_SimpleString("import os");
PyRun_SimpleString("import sys");
/* * * * IF I COMMENT THE FOLLOWING LINE OUT, pModule IS ALWAYS SET TO NULL * * * */
PyRun_SimpleString("sys.path.insert(0, os.getcwd())");
pModule = PyImport_Import(pName);

Py_DECREF(pName);
if (pModule != NULL)
{
pFunc = PyObject_GetAttrString(pModule, func_name);
}
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, func_name);
if (PyCallable_Check(pFunc))
{
PyObject_CallObject(pFunc, NULL);
Py_DECREF(pModule);
Py_DECREF(pName);
}
else
{
PyErr_Print();
}
Py_Finalize();
return 0;
}

如上述 C 程序的注释中所述,注释掉包含 PyRun_SimpleString("sys.path.insert(0, os.getcwd())") 的行会导致调用 PyImport_Import 失败(返回 NULL)。此外,调用 PyRun_SimpleString("import test_script") 的行为方式似乎相同。

为什么我需要手动将当前工作目录添加到 Python 的 sys.path 字符串列表,而只是从同一工作目录中的另一个 Python 脚本导入它?此外,为什么 Python 不首先搜索当前工作目录(因为 os.getcwd() 返回正确的路径)?如果我希望从与我的 C 应用程序捆绑在一起的脚本中导入函数,这是一个合适的解决方案吗?

最佳答案

将脚本目录添加到sys.pathpython 可执行文件的一个特性;解释器初始化时默认情况下不会这样做,因为在嵌入式应用程序中这样做并不总是合适的。

关于python - 为什么在从 C 应用程序导入 Python 脚本时需要将 os.getcwd() 显式添加到 sys.path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com