我试图将pythonembedding与python3结合使用,但不幸的是,在使用它时会出现一些奇怪的结果。以下是源代码:
/tmp文件/主.cpp你知道吗
#include <python3.6/Python.h>
//#include <python2.7/Python.h>
using namespace std;
int main()
{
Py_Initialize();
PyObject* sysPath = PySys_GetObject("path");
PyObject *path = PyBytes_FromString("/tmp");
int result = PyList_Append(sysPath, path);
PyRun_SimpleString("from hello import hello\n"); // there is a /tmp/hello.py
Py_Finalize();
return 0;
}
如果我像这样在Python 2.7中编译并运行上述代码,它不会显示任何错误:
g++ -L/usr/lib/python2.7/config-x86_64-linux-gnu/ -g -o main main.cpp -I/usr/include/python2.7 -lpython2.7
但是,如果我在Python3.6中编译并运行如下代码:
g++ -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ -g -o main main.cpp -I/usr/include/ -lpython3.6
它将显示以下错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
from . import add_newdocs
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/lib/__init__.py", line 8, in <module>
from .type_check import *
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/lib/type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/core/__init__.py", line 35, in <module>
from . import _internal # for freeze programs
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/core/_internal.py", line 12, in <module>
from numpy.compat import basestring
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/compat/__init__.py", line 14, in <module>
from . import py3k
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/compat/py3k.py", line 14, in <module>
from pathlib import Path
File "/usr/lib/python3.6/pathlib.py", line 4, in <module>
import ntpath
File "/usr/lib/python3.6/ntpath.py", line 278, in <module>
from nt import _getvolumepathname
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 894, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
File "<frozen importlib._bootstrap_external>", line 1129, in _get_spec
File "<frozen importlib._bootstrap_external>", line 1268, in find_spec
File "<frozen importlib._bootstrap_external>", line 60, in _path_join
File "<frozen importlib._bootstrap_external>", line 60, in <listcomp>
TypeError: a bytes-like object is required, not 'str'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 57, in apport_excepthook
from cStringIO import StringIO
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 894, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
File "<frozen importlib._bootstrap_external>", line 1129, in _get_spec
File "<frozen importlib._bootstrap_external>", line 1268, in find_spec
File "<frozen importlib._bootstrap_external>", line 60, in _path_join
File "<frozen importlib._bootstrap_external>", line 60, in <listcomp>
TypeError: a bytes-like object is required, not 'str'
Original exception was:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
from . import add_newdocs
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/lib/__init__.py", line 8, in <module>
from .type_check import *
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/lib/type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/core/__init__.py", line 35, in <module>
from . import _internal # for freeze programs
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/core/_internal.py", line 12, in <module>
from numpy.compat import basestring
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/compat/__init__.py", line 14, in <module>
from . import py3k
File "/home/tfidm/.local/lib/python3.6/site-packages/numpy/compat/py3k.py", line 14, in <module>
from pathlib import Path
File "/usr/lib/python3.6/pathlib.py", line 4, in <module>
import ntpath
File "/usr/lib/python3.6/ntpath.py", line 278, in <module>
from nt import _getvolumepathname
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 894, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
File "<frozen importlib._bootstrap_external>", line 1129, in _get_spec
File "<frozen importlib._bootstrap_external>", line 1268, in find_spec
File "<frozen importlib._bootstrap_external>", line 60, in _path_join
File "<frozen importlib._bootstrap_external>", line 60, in <listcomp>
TypeError: a bytes-like object is required, not 'str'
如果我删除三行以将当前目录附加到系统路径,如下所示:
Py_Initialize();
PyRun_SimpleString("from hello import hello\n");
它将在Python2和Python3中显示以下错误:
ModuleNotFoundError: No module named 'hello'
从场景2中,我们可以看到需要将当前目录添加到系统路径的行。添加路径完成后,场景1中的代码只能在python2中工作。python3的错误日志显示,它需要的是byte对象,而不是字符串。但是,我不知道如何使用嵌入byte对象,因为我在python官方网站或web上的任何其他地方都找不到它。你知道吗
请有人解释一下如何在python3中正确使用嵌入?你知道吗
python3
sys.path
采用Unicode字符串,而不是字节字符串。不要使用PyBytes_FromString
来创建path元素。你知道吗至少在嵌入python3时,使用^{} 。你知道吗
如果path元素只包含ASCII字符,那么可以在python2中使用相同的函数。python2.x中
sys.path
元素对非ASCII字符的支持是不稳定的,并且依赖于操作系统。你知道吗相关问题 更多 >
编程相关推荐