[英]TypeError about needing 'bytes' not 'str' in Python
[英]Import in python 3 complains about argument as a str / bytes
我正在更新一个四元数据包以便与numpy集成,因此它可以在python 2和python 3中使用。不幸的是,基本导入步骤在3.x中失败,尽管它从未使用python 2.7失败。 (我使用python2.7编译2.7版本,使用python3.x编译3.x版本。这是一个非常简单的distutils事。)错误信息甚至没有出现在google的结果中,我只是不知道从这往哪儿走。
以下是导入包的简单尝试的完整输出:
> python -c 'import quaternion'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/mynamehere/.continuum/anaconda/envs/py3k/lib/python3.4/site-packages/quaternion/__init__.py", line 3, in <module>
from .numpy_quaternion import quaternion
TypeError: __import__() argument 1 must be str, not bytes
正如错误消息所示, __init__.py
有一行说
from .numpy_quaternion import quaternion
但为什么这会有问题呢? 在与__init__.py
文件相同的目录中有一个文件numpy_quaternion.so
,它似乎包含相关的符号。 Travis-CI显示它在2.7(和其他测试通过)中工作正常,但在3.2和3.4中失败。 所以这不仅仅是我的python安装有问题。 我试图删除.
对于相对导入,但是python找不到要导入的numpy_quaternion
(这并不奇怪)。 我尝试将其更改为from quaternion.numpy_quaternion
,但我得到了同样的错误。
我看到python 3中的导入系统已经发生了变化 ,但是如果有的话,我会猜测这比其他方式更符合py3k。 出了什么问题? 我怎样才能让它发挥作用?
只是为了澄清,我的层次结构如下所示:
.../site-packages/
quaternion/
__init__.py
numpy_quaternion.so
并且在有问题的行之前唯一的事情是import numpy as np
,它通常成功没有问题。
蟒蛇名单上的人们立即回复我,提出了很好的建议。 事实证明我在numpy_quaternion.so
中导入了一些numpy_quaternion.so
(使用c-api),但我给该函数的参数是错误的。 我(基本上)使用类似包中的代码:
PyObject* numpy_str = PyString_FromString("numpy");
PyObject* numpy = PyImport_Import(numpy_str);
我用它来修复它
PyObject* numpy = PyImport_ImportModule("numpy");
正如JF Sebastian在评论中指出的那样,对我来说错误的原因是因为当我使用python 3时, PyString_FromString
只是#define
用于错误的函数。
既然这很容易,我会首先尝试绝对导入,但如果我的猜测是正确的,这将无法正常工作。
from quaternion.numpy_quaternion import quaternion
从你的帖子,我猜你的层次结构看起来像
.../Libe/site-packages
quaternion
__init__.py
numpy_quaternion.so
quaternion # a symbol in .so, not a .py
而quaterion是一个模块,而不是一个函数或类。 我猜这是因为我无法想象'numpy_quaternion'会变成字节,而.so必须返回'quaternion'作为2.7的字节才能工作,所以也许它对3.x执行相同的操作。 我的unix体验早于Python。 但我的印象是,2.x和3.x需要单独的.so。 或者如果不是,则可能需要某些编译标志。 如果我是正确的,你需要在你的包中添加'numpy_quaternion_3x.so并在sys.version [0]上切换导入。
如果你在这里没有得到更多回复,请尝试使用python-list,可以在news.gmane.com上轻松访问,作为新闻组镜像gmane.comp.python.general。 常规响应者包括一些精明的Linux用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.