我正在阅读有关使用 C/C++ 扩展 Python的 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 应用程序捆绑的脚本中导入函数,这是一个合适的解决方案吗?