(Python/capi)";ModuleNotFoundError“;对于子目录中的模块
我正在C程序中使用Python3。我想做的是“运行”一个Python文件(.py),它将是一个更大Python项目的主文件 当我在这个Python文件中使用(Python/capi)";ModuleNotFoundError“;对于子目录中的模块,python,c,python-3.6,python-c-api,Python,C,Python 3.6,Python C Api,我正在C程序中使用Python3。我想做的是“运行”一个Python文件(.py),它将是一个更大Python项目的主文件 当我在这个Python文件中使用import时,它可以很好地用于同一目录中的其他Python文件。事实上,每当我在终端中使用“Python”运行.py文件时,import也适用于子目录中的文件 但是,如果我在C中使用PyRun\u SimpleFile运行它,我会收到一个“ModuleNotFoundError”错误 以下是我的目录设置: Project/ |-- Prog
import
时,它可以很好地用于同一目录中的其他Python文件。事实上,每当我在终端中使用“Python”运行.py文件时,import
也适用于子目录中的文件
但是,如果我在C中使用PyRun\u SimpleFile
运行它,我会收到一个“ModuleNotFoundError”错误
以下是我的目录设置:
Project/
|-- Program.cpp
|-- Program.exe
|-- __init__.py
|-- bla.py
|-- Test/
| |-- __init__.py
| |-- bla2.py
最好不要使用sys.path.append('./Test')
,这样就可以在导入中使用子目录名
以下是所有相关文件的内容:
布拉·皮
import Test.bla2
无聊的
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;
}
#包括
#包括
int main(int argc,字符**argv)
{
Py_初始化();
FILE*FILE=_Py_fopen(“bla.Py”、“r”);
PyRun_SimpleFile(文件“bla.py”);
Py_Finalize();
返回0;
}
您只需添加
PySys_SetArgv(1, argv);
在Py_初始化之后
()。这会将程序所在的目录前置到Python路径。(这等同于将代码< >代码> >路径,而不是<代码> ./Test< /Cord>,但它应该更可靠,例如,如果程序不是从它自己的目录开始的,它就从C++中获得了程序所需的信息。
调用模块
Test
可能不是一个好主意。有一个内置的Python模块,名为test
,在不区分大小写的操作系统(如Windows)上,可能会发生冲突并被加载 也许这可以帮助你:@Pablo谢谢你的建议;然而,这似乎与这里的问题无关。我确实试过一些答案,但没用。请记住,Python对我来说工作得非常好,只有在通过C程序运行时,导入语句才会引起问题。也许它可以帮助您在调用PyRun\u SimpleFile
之前使用setenv
并在PYTHONPATH
中添加模块路径。可能正是你想要的。谢谢,很有魅力!^^然而,我确实收到了一个错误。我已经通过简单地将argv解析为wchar\u t**解决了这个问题,但也许有更好的方法来处理它<代码>错误:无法将参数“2”的“char**”转换为“wchar\u t**”,将其转换为“void PySys\u SetArgv(int,wchar\u t**)”PySys\u SetArgv(1,argv)代码>啊-我在测试时不小心使用了Python 2而不是3,所以没有看到那个错误。。。我不知道有什么比解析更好的方法了。