(Python / C API)“ModuleNotFoundError”用于子目录中的模块

时间:2018-02-04 16:56:05

标签: python c python-3.6 python-c-api

我在C程序中使用Python 3。我想做的是“运行”一个Python文件(.py),它将成为更大的Python项目的主要文件。

当我在这个Python文件中使用import时,它适用于同一目录中的其他Python文件。实际上,每当我在终端中使用“Python”运行.py文件时,import也适用于子目录中的文件。

但是,如果我在C中使用PyRun_SimpleFile运行它,则会收到“ModuleNotFoundError”错误。

这是我的目录设置:

Project/
|-- Program.cpp
|-- Program.exe
|-- __init__.py
|-- bla.py
|-- Test/
|   |-- __init__.py
|   |-- bla2.py

最好,我不想使用sys.path.append('./Test'),因此我可以在导入中使用子目录名称。

以下是所有相关文件的内容:

bla.py

import Test.bla2

bla2.py

print("in bla2.py now!")

Program.cpp

#include <Python.h>
#include <iostream>

int main(int argc, char **argv)
{
    Py_Initialize();

    FILE *file = _Py_fopen( "bla.py", "r" ); 
    PyRun_SimpleFile(file, "bla.py");

    Py_Finalize();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

你只需要添加

PySys_SetArgv(1, argv);
Py_Initializedocumentation)之后

。这会将您的程序所在的目录添加到Python路径中。 (这相当于将.添加到路径而不是./Test,但它应该更可靠,例如,如果您的程序不是从其自己的目录启动的。它获取所需的信息您的程序位于C ++ argv

调用模块Test可能不太好。有一个名为test的内置Python模块,在一个不敏感的操作系统上,如Windows,可能会发生冲突并被加载。