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

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

这是一个示例尝试:

Makefile文件:

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  void run_in_py2(const char* const str) { Py_Initialize(); PyRun_SimpleString(str); Py_Finalize(); } 

run_in_py3.c:

 #include  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解释器

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

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