簡體   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