嵌入Python2和Python3解释器,选择在运行时使用哪一个

时间:2015-06-04 15:09:43

标签: python c linker

有没有一种方法可以将Python2和Python3解释器嵌入到C程序中,然后在运行时决定运行另一个

以下是尝试的示例:

生成文件:

all: main


main: main.c librun_in_py2.so librun_in_py3.so
    g++ main.c -lrun_in_py2 -lrun_in_py3 -L. -Wl,-rpath -Wl,$$ORIGIN -o main

librun_in_py2.so: run_in_py2.c
    g++ $$(python2.7-config --cflags --ldflags) -shared -fPIC $< -o $@

librun_in_py3.so: run_in_py3.c
    g++ $$(python3.4-config --cflags --ldflags) -shared -fPIC $< -o $@

clean:
    @-rm main *.so

的main.c

void run_in_py2(const char* const str);
void run_in_py3(const char* const str);

static const char str2[] = "from time import time,ctime\n"
                           "import sys\n"
                           "print sys.version_info\n"
                           "print 'Today is',ctime(time())\n";

static const char str3[] = "from time import time,ctime\n"
                           "import sys\n"
                           "print(sys.version_info)\n"
                           "print('Today is', ctime(time()))\n";
int main(int argc, char* [])
{
    if (argc == 2)
        run_in_py2(str2);
    else
        run_in_py3(str3);
}

run_in_py2.c

#include <Python.h>

void run_in_py2(const char* const str)
{
    Py_Initialize();
    PyRun_SimpleString(str);
    Py_Finalize();
}

run_in_py3.c:

#include <Python.h>

void run_in_py3(const char* const str)
{
   Py_Initialize();
    PyRun_SimpleString(str);
    Py_Finalize();
}

由于库链接的顺序,结果总是相同的:

$ ./main
sys.version_info(major=2, minor=7, micro=9, releaselevel='final', serial=0)
('Today is', 'Thu Jun  4 10:59:29 2015')

由于名称相同,因此链接器看起来像是使用Python 2解释器解决所有问题。有没有办法隔离名称或鼓励链接器解决它们更懒惰?如果可能的话,理想的做法是让链接器确认所有名称都可以被解析,然后推迟符号解析,直到可以选择适当的链接器。

一个高度相关的问题是要求同时运行两个独立的嵌入式解释器:

Multiple independent embedded Python Interpreters on multiple operating system threads invoked from C/C++ program

建议使用两个单独的流程,但我怀疑这个问题的答案更简单。

这个问题背后的原因是,当有一个程序执行此操作时,我认为我从与某人的对话中理解了。现在我只是好奇它将如何完成。

0 个答案:

没有答案