我正在浏览有关 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
#include
PyObject *pName, *pModule, *pDict, *pFunc, *pVal;
int chính()
{
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);
}
khác
{
PyErr_Print();
}
Py_Finalize();
trả về 0;
}
如上述 C 程序的注释中所述,注释掉包含 PyRun_SimpleString("sys.path.insert(0, os.getcwd())")
的行会导致调用 PyImport_Import
失败(返回 VÔ GIÁ TRỊ
)。此外,调用 PyRun_SimpleString("import test_script")
的行为方式似乎相同。
为什么我需要手动将当前工作目录添加到 Python 的 sys.path
字符串列表,而只是从同一工作目录中的另一个 Python 脚本导入它?此外,为什么 Python 不首先搜索当前工作目录(因为 os.getcwd()
返回正确的路径)?如果我希望从与我的 C 应用程序捆绑在一起的脚本中导入函数,这是一个合适的解决方案吗?
将脚本目录添加到sys.path
Đúngpython
可执行文件的一个特性;解释器初始化时默认情况下不会这样做,因为在嵌入式应用程序中这样做并不总是合适的。
Tôi là một lập trình viên xuất sắc, rất giỏi!