繁体   English   中英

在python 3中导入抱怨参数为str / bytes

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM