有没有一种好方法可以将Python2和Python3解释器嵌入到C程序中,然后运行其中一个or另一个是在运行时做出的决定?
这是一个尝试示例:
生成文件:
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 解释器解析了所有内容。是否有某种方法可以隔离名称或鼓励链接器在解析它们时更加懒惰?如果可能的话,最好让链接器确认所有名称都可以解析,但推迟符号解析,直到可以选择适当的链接器为止。
一个高度相关的问题询问如何同时运行两个独立的嵌入式解释器:
从 C/C++ 程序调用的多个操作系统线程上的多个独立嵌入式 Python 解释器 https://stackoverflow.com/questions/2968317/multiple-independent-embedded-python-interpreters-on-multiple-operating-system-t
建议使用两个单独的进程,但我怀疑这个问题有一个更简单的答案。
这个问题背后的原因是,我认为我从很久以前与某人的对话中了解到,当时有一个程序可以做到这一点。现在我只是好奇这将如何完成。