从C运行并行的Python脚本
我有一个Python脚本,通常我会通过以下命令来并行运行它。
mpirun -n x script.py
我想知道是否可以把这个并行的Python代码嵌入到一个C程序里?
也就是说,python.org上有介绍如何在C语言中嵌入Python代码,具体可以查看这里。比如:
#include <Python.h>
int
main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n");
Py_Finalize();
return 0;
}
如果代码是并行的Python代码,而不是报告时间,是否也可以做类似的事情呢?我现在的临时解决方案是:
sprintf(command_string,"mpirun -n x python script.py");
system(command_string);
但这个方法不久后就不行了。
谢谢,
托马斯
1 个回答
0
你的脚本有没有用到MPI(比如说mpi4py)呢?
你可以在C程序里运行Python代码,就像你描述的那样,还有其他一些方法,但如果程序里有MPI的调用,那么这个可执行文件就必须链接到MPI库。
一种方法是用mpirun来运行C程序。你只需要像之前那样编译和运行:
mpirun -n x cprog
在你的C程序里,你可以执行Python代码,这样它就会在一个并行的环境中运行(因为C程序现在是并行运行的)。如果你真的需要使用MPI库,这里可能会有额外的工作。
如果你需要MPI的调用(比如MPI_Comm_rank等),你可以把MPI库链接到你的C程序里,像上面那样执行,调用你需要的MPI命令,然后通过Python的C API把数据传给Python代码。
如果你不需要MPI的调用(也就是说你只是用mpirun在你的集群上启动多个Python脚本),那么直接用mpirun
运行你的C程序就可以了。
你也可以并行启动C程序,并在Python脚本中使用MPI,但要记住,你应该在Python层面上完成MPI_Init
和MPI_Finalize
,而不是在Python和C中都做。
如果你必须串行运行C程序,我想你需要通过命令行来启动并行任务。