我一直在updating a quaternions package與numpy集成,因此它可以在python 2和python 3中使用。不幸的是,基本導入步驟失敗與3失敗。 x,儘管python 2.7從來沒有失敗過。 (我使用python2.7來編譯2.7版本,而python3.x來編譯3.x版本,這是一個非常簡單的distutils事情。)這個錯誤消息甚至沒有出現在google的結果中,我也不知道從這往哪兒走。導入python 3抱怨參數爲str/bytes
下面是一個簡單的嘗試導入的包輸出完整:
> 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
,但我得到相同的錯誤。
我看到there have been changes to the import system in python 3,但如果有的話,我會猜測這將是更多 py3k兼容比其他方式做它。出了什麼問題?我怎樣才能使這個工作?
只是爲了澄清,我的層次結構是這樣的:
.../site-packages/
quaternion/
__init__.py
numpy_quaternion.so
和到來之前有問題的線路import numpy as np
,一般沒有問題成功的唯一的事情。
注意:[將擴展模塊移植到Python 3](https://docs.python.org/3/howto/cporting.html):*「C中的Python 3的'PyString_ *'函數等同於Python 2的'PyUnicode_ * '「*。對於Unicode文本使用'PyString',對二進制數據使用'PyBytes'。你的問題中的TypeError表明你以某種方式在Python 3上使用PyBytes,而不是PyString。 – jfs 2014-10-21 02:41:46
啊哈!不是直接的,但我*做*包含'npy_3kcompat.h',它'#define PyString_FromString PyBytes_FromString'。所以它看起來很適合我,但事實並非如此。實際上'PyString_FromString'甚至沒有在python3中定義。 – Mike 2014-10-21 03:28:39