我用一些python代码扩展了我的c程序(在c中初始化一个python env,然后从python模块导入一个函数并运行它(,在这种情况下,我不得不调用多处理模块并生成一个没有__main__函数的进程,我知道它在__main__中工作,但是我可以在我的C程序中做点什么,让它可以在__main__之外执行多处理派生吗。
文件x.c
#include <Python.h>
#include <iostream>
using namespace std;
int main()
{
Py_Initialize();
PyObject *module_name = PyUnicode_FromString("t1");
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append("./")");
cout << "Python Version: " << endl << Py_GetVersion() << endl << endl;
PyObject *module = PyImport_Import(module_name);
PyObject *func = PyObject_GetAttrString(module, "run");
PyObject *args = Py_BuildValue("()");
PyObject_CallObject(func, args);
Py_DECREF(args);
Py_DECREF(func);
Py_DECREF(module);
Py_DECREF(module_name);
return 0;
}
- 生成文件*
all:
g++ -O0 -g3 -std=c++11 x.c $(shell python3-config --includes) $(shell python3-config --ldflags) -o a.out -Wall
文件t1.py
# -*- coding: utf-8 -*-
import multiprocessing as mp
def test():
print("hello world")
def run():
ctx = mp.get_context('spawn')
# ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()
# run()
从x.c调用run函数将不打印任何内容,而在t1.py末尾添加run((并直接使用python3 t1.py运行,则会引发"freeze_support"错误。
t2.py
# -*- coding: utf-8 -*-
import multiprocessing as mp
def test():
print("hello world")
def run():
# ctx = mp.get_context('spawn')
ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()
如果从x.c 调用run函数,此脚本可以打印hello世界
t3.py
# -*- coding: utf-8 -*-
import multiprocessing as mp
def test():
print("hello world")
def run():
ctx = mp.get_context('spawn')
# ctx = mp.get_context('fork')
p = ctx.Process(target=test, args=())
p.start()
p.join()
if __name__ == "__main__":
run()
这个单独运行的脚本(python3.5 t3.py(也可以运行(最后打印hello world(
我想在c程序中执行没有__main__项的run函数(通过PyObject_CallObject(,那么,我该如何使它工作呢。
在"上下文和启动方法"一节的末尾有以下警告:
警告:
'spawn'
和'forkserver'
启动方法当前不能与Unix上的"冻结"可执行文件(即由PyInstaller和cx_Freeze等包生成的二进制文件(一起使用。'fork'
启动方法确实有效。
由于multiprocessing
从运行已编译(即冻结(可执行文件的当前进程中创建新进程,因此无法使用'spawn'
作为启动方法。
但是,您可以继续使用"fork
"(正如您在示例中所描述的那样(。