微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-3.x – Python 3.6,嵌入式C,添加模块路径,TypeError:需要类似字节的对象,而不是’str’

我试图在C ++应用程序中嵌入 Python 3.6时扩展模块搜索路径.将当前工作目录插入系统模块搜索路径的代码是:

PyObject *sysPath = PySys_Getobject("path");
PyObject *path = PyBytes_FromString(".");
int result = PyList_Insert(sysPath,path);

这工作正常(没有错误),但是当我尝试运行模块时Python不高兴:

PyObject *pModule = PyImport_ImportModule("python_demo_x");

Python报告的错误是:

Could not load module python_demo_x
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>",line 961,in _find_and_load
  File "<frozen importlib._bootstrap>",line 946,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 885,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 1245,line 1302,in _fill_cache
TypeError: a bytes-like object is required,not 'str'

通过反复试验,我发现用双引号包装路径解决了这个问题:

PyObject *path = PyBytes_FromString("\".\"");

我找不到任何表明包装路径是必需的文档.这是必需的,还是有其他错误

解决方法

Python 3改变了字符串的表示方式.
我在使用Popen从外部执行其他应用程序和代码时遇到过这种情况.

尝试将所有字符串从“some-string”更改为b“some-string”,将其编码为字节字符串.
如果需要字符串返回值,则可能需要将生成的字节对象解码为字符串.
你会这样做:.decode(‘utf-8’)

从Python 3.6文档:
“在Python 3.x中,那些隐式转换已经消失 – 8位二进制数据和Unicode文本之间的转换必须是显式的,字节和字符串对象总是比较不相等.”

更多信息请访问:https://docs.python.org/3/library/stdtypes.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐