有没有一种方法可以将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解释器解决所有问题。有没有办法隔离名称或鼓励链接器解决它们更懒惰?如果可能的话,理想的做法是让链接器确认所有名称都可以被解析,然后推迟符号解析,直到可以选择适当的链接器。
一个高度相关的问题是要求同时运行两个独立的嵌入式解释器:
建议使用两个单独的流程,但我怀疑这个问题的答案更简单。
这个问题背后的原因是,当有一个程序执行此操作时,我认为我从与某人的对话中理解了。现在我只是好奇它将如何完成。