Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中的Import以str/bytes形式抱怨参数_Python_Python 2.7_Python 3.x_Python Import_Python C Api - Fatal编程技术网

Python3中的Import以str/bytes形式抱怨参数

Python3中的Import以str/bytes形式抱怨参数,python,python-2.7,python-3.x,python-import,python-c-api,Python,Python 2.7,Python 3.x,Python Import,Python C Api,我一直在考虑与numpy集成,这样它就可以在Python2和Python3中使用。不幸的是,基本导入步骤在3.x中失败得很惨,尽管在Python2.7中从未失败过。(我用python2.7来编译2.7版本,用python3.x来编译3.x版本。这是一个非常简单的distutils工具。)错误信息甚至没有出现在谷歌的结果中,我只是不知道从这里该去哪里 以下是导入包的简单尝试的完整输出: > python -c 'import quaternion' Traceback (most recen

我一直在考虑与numpy集成,这样它就可以在Python2和Python3中使用。不幸的是,基本导入步骤在3.x中失败得很惨,尽管在Python2.7中从未失败过。(我用python2.7来编译2.7版本,用python3.x来编译3.x版本。这是一个非常简单的distutils工具。)错误信息甚至没有出现在谷歌的结果中,我只是不知道从这里该去哪里

以下是导入包的简单尝试的完整输出:

> 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
但为什么会有问题呢?有一个文件
numpy\u四元数.so
\uuuuu init\uuuuuuu.py
文件位于同一目录中,该文件似乎包含相关符号。显示它在2.7中工作正常(其他测试通过),但在3.2和3.4中失败。所以这不仅仅是我的python安装有问题。我试图删除相对导入的
,但python找不到要从中导入的
numpy\u四元数(不足为奇)。我尝试将其从四元数.numpy\u四元数更改为
,但得到了相同的错误

我明白了,但如果有什么不同的话,我会猜这比其他方法更符合py3k。怎么了?我怎样才能让它工作

为了澄清,我的层次结构如下所示:

.../site-packages/
    quaternion/
        __init__.py
        numpy_quaternion.so

在出现问题的行之前,唯一的一件事是
将numpy导入为np
,这通常是成功的,没有问题。

因为这很简单,我会首先尝试绝对导入,但是如果我下面的猜测是正确的,这将不起作用

from quaternion.numpy_quaternion import quaternion
从你的帖子中,我猜你的层次结构

.../Libe/site-packages
    quaternion
    __init__.py
    numpy_quaternion.so
        quaternion  # a symbol in .so, not a .py
四元数是一个模,而不是一个函数或类。我猜这是因为我无法想象“numpy_四元数”变成字节,而.so必须将“四元数”作为字节返回,以使2.7正常工作,所以可能对3.x也是如此。我的unix经验早于Python。但我的印象是,2.x和3.x是分开的。否则,可能需要某些编译标志。如果我是正确的,您需要将'numpy_quaternion_3x.so'添加到包中,并在sys.version[0]上切换导入


如果您在这里没有得到更多响应,请尝试python列表,该列表可以在news.gmane.com上轻松访问为新闻组mirror gmane.comp.python.general。定期的回复者包括一些精明的linux用户。

python列表中的人马上给了我很好的建议。原来我是在导入
numpy\u四元数中的东西。所以
(使用c-api),但我给该函数的参数是错误的。我(基本上)使用的代码来自:

我用电脑把它修好了

PyObject* numpy = PyImport_ImportModule("numpy");

正如J.F.Sebastian在评论中指出的那样,对我来说出错的原因是因为当我使用python 3时,
PyString\u FromString
只是对错误函数的
\define

是的,我尝试了绝对导入。(在我的帖子中提到过,但我没有说清楚。)另外,py2.7和py3.x有单独的
lib
目录,每个目录都用于编译自己的目录,所以它们有自己的
。所以
文件。(py3.x甚至不知道py2.7的存在。)不过,我会试试python列表。谢谢注意::“C语言中Python3的
PyString.*
函数等同于Python2的
PyUnicode.*
”。Unicode文本使用
PyString
,二进制数据使用
PyBytes
。您问题中的TypeError建议您以某种方式在Python3上使用PyBytes,而不是PyString.Aha!不是直接的,但我确实包含了
npy\u 3kcompat.h
,它定义了PyString\u FromString PyBytes\u FromString
。所以在我看来是对的,但事实并非如此;实际上,python3中甚至没有定义
PyString\u FromString
PyObject* numpy_str = PyString_FromString("numpy");
PyObject* numpy = PyImport_Import(numpy_str);
PyObject* numpy = PyImport_ImportModule("numpy");