![](/img/trans.png)
[英]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.