2014-10-20 33 views
3

我一直在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,一般沒有問題成功的唯一的事情。

回答

3

python-list人員馬上給我回復,提出了很好的建議。事實證明,我在numpy_quaternion.so(使用c-api)中導入了一些東西,但是我給這個函數的理由是錯誤的。我是(基本上)使用代碼a similar package

PyObject* numpy_str = PyString_FromString("numpy"); 
PyObject* numpy = PyImport_Import(numpy_str); 

我用

PyObject* numpy = PyImport_ImportModule("numpy"); 

隨着JF塞巴斯蒂安在評論中指出,固定它,這是走錯了,我是因爲該原因PyString_FromString只是一個#define錯誤的功能,當我使用python 3.

+1

注意:[將擴展模塊移植到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

+0

啊哈!不是直接的,但我*做*包含'npy_3kcompat.h',它'#define PyString_FromString PyBytes_FromString'。所以它看起來很適合我,但事實並非如此。實際上'PyString_FromString'甚至沒有在python3中定義。 – Mike 2014-10-21 03:28:39

0

既然這很容易,我會先嚐試一個絕對導入,但如果我的猜測是正確的,這是行不通的。

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。但我的印象是,單獨的.so是2.x和3.x所必需的。否則,可能需要某些編譯標誌。如果我是正確的,則需要將'numpy_quaternion_3x.so'添加到您的包中,並在sys.version [0]上切換導入。

如果您在這裏沒有得到更多答覆,請嘗試python-list,在news.gmane.com上輕鬆訪問,作爲新聞組鏡像gmane.comp.python.general。常規響應者包括一些精明的Linux用戶。

+0

是的,我試過絕對導入。 (在我的文章中提到過,但我沒有說清楚。)另外,py2.7和py3.x有單獨的'lib'目錄,每個目錄都用於編譯它自己的目錄,所以它們確實得到它們的擁有'.so'文件。 (py3.x甚至不知道py2.7的存在。)但我會嘗試在python列表中。謝謝! – Mike 2014-10-20 22:22:39