2

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

4

1 回答 1

4

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

于 2012-10-25T22:06:39.520 回答