1

Adalm Pluto 连接到运行 Linux Mint 20 的笔记本电脑。尝试运行一个非常基本的 Python 脚本并收到错误“TypeError: 'Context' object is not callable”。

确实有一个较早的错误,即 Python 无法找到 iio.py 模块,但这已通过更新 bashrc 脚本中的 $PYTHONPATH 变量得到修复。

其他所有测试似乎都可以正常工作。Pluto 本身看起来工作正常,并且在 Windows 10 上连接到 SATSAGEN 时表现出色。

不知道怎么进步。任何指针都非常感谢。

Python代码:

# Import library
import adi
# Create radio object
sdr = adi.Pluto(uri="ip:192.168.2.1")
# Configure properties
sdr.rx_rf_bandwidth = 4000000
# Get data
data = sdr.rx()

终端输出:

bob@SamsungLaptop:~$ python "/home/bob/Documents/Python scripts/Pluto/pluto_check_installation.py"
Traceback (most recent call last):
File "/home/bob/Documents/Python scripts/Pluto/pluto_check_installation.py", line 8, in <module>
data = sdr.rx()
File "/usr/local/lib/python3.8/dist-packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py", line 250, in rx
return self.__rx_complex()
File "/usr/local/lib/python3.8/dist-packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py", line 171, in __rx_complex
self._rx_init_channels()
File "/usr/local/lib/python3.8/dist-packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py", line 127, in _rx_init_channels
self.__rxbuf = iio.Buffer(self._rxadc, self.__rx_buffer_size, False)
File "/home/bob/libiio/bindings/python/iio.py", line 1016, in __init__
self._ctx = device.ctx()
TypeError: 'Context' object is not callable

上面的 Python 代码也在解释器模式下运行,并且最后一行之前的所有命令都被接受。

已尝试其他示例脚本,但包含“sdr.rx()”的行似乎导致错误。与 Pluto 的通信似乎可以正常工作(例如,如上所述设置了射频带宽,这可以通过打印命令进行检查。此外,可以通过 USB 连接或 IP 地址或通过 ssh 或通过 PuTTY 进行通信)。libiio 库似乎没问题(例如,输入“iio_info -s”或“iio_info -u Pluto.local”正在工作。pyadi 库似乎没问题(例如,adi 的导入工作没有错误)

安装: A) 带有 Cinnammon GUI 的 Linux Mint 20(内核从 v5.4 更新到 v5.8 以解决另一个问题)。B) libiio、libadad9361-iio 和 pyadi-iio 均根据 PySDR ( https://pysdr.org/content/pluto_intro.html ) 第 5 章从源代码生成并安装。上述 Python 示例在同一章中提供,作为检查安装的方法。

4

2 回答 2

1

我假设您使用的是带有 python 绑定的 libiio v0.21。不知何故,在 0.19 版本(或者可能是 0.20,我现在无法获得源代码)和 0.21 之间,weakref 的使用被删除了,这引入了这个错误。(见:https ://github.com/analogdevicesinc/libiio/issues/648 )我想这意味着这个SO问题很快就会变得无关紧要。

尝试使用 0.19 或者您可以考虑通过编辑 /home/bob/libiio/bindings/python/iio.py 来解决问题的两种不同方法

首先是通过在您自己中添加相关行来恢复到 v0.19 中的情况。

在“import abc”行之后添加“import weakref”:

import abc
import weakref

将类 Device 的init方法中的行更改为:

self.ctx = weakref.ref(ctx)

这将适用于该演示代码,但我认为它不完全正确,因为弱引用有点违背缓冲区对象创建新引用的目的。从 v0.21 代码:

self._ctx = device.ctx()
# Holds a reference to the corresponding IIO Context. This ensures that
# every iio.Buffer object is destroyed before its corresponding IIO Context.

由于弱引用,如果对象的非弱引用被删除,则无法确保该对象仍然存在。从这个意义上说,您可以尝试将所有“ctx()”替换为“ctx”。v0.21 中应该有 3 个实例。这也适用于我,是我目前首选的解决方法。

警告:可能涉及不太明显的问题,如果这是代码维护人员来回处理的问题,那么任何修复都可能只是在玩“打地鼠”。

于 2021-02-07T06:56:29.497 回答
0

Mark H,自从我发帖以来,我对此的理解有了很大的提高——但我很确定你已经解决了这个问题。我将提供一些细节,希望它可以帮助其他人,因为上下文很重要。

我的目标是在 Linux 上获得一个工作环境,满足 1)Adalm Pluto、2)使用 pyadi-iio 的 Python 控制和 3)GNU Radio。如果像我一样你想要这三个,它会增加额外的维度。

我必须解决的问题(感谢 Analog Devices 的 Travis)是进行两项更改 - 替换文件并更改其名称 - A)将“iio.py”文件替换为弱引用版本(来自下面的链接) https: //raw.githubusercontent.com/analogdevicesinc/libiio/tfcollins-py-weak-ref/bindings/python/iio.py B)将文件重命名为'weak_iio.py' C)进入pyadi-iio文件夹( ADI)并编辑两个文件(“rx_tx.py”和“context_manager.py”)。每个中的单行 - 'import iio' - 需要更改为 'import weak_iio as iio'

这使得几个 Python pyadi-iio 脚本现在也可以正常工作,但不会影响正常工作的 GNU Radio。

我还没有遇到不起作用的 python / pyadi 脚本,但是 Travis 建议的测试脚本(如下)在最后一行仍然失败,所以可能还有其他问题我还没有解决。

import adi
sdr = adi.Pluto('ip:pluto.local')
print(dir(sdr._ctx))
print(sdr._ctx.name)
print(dir(sdr._rxadc))
print(dir(sdr._rxadc.ctx()))

Traceback (most recent call last):
File "travis_test2.py", line 6, in <module>
print(dir(rx._rxadc.ctx()))
NameError: name 'rx' is not defined

使用 pipenv 创建了一个虚拟环境,并且该脚本在其中运行时没有错误。所以,到目前为止,我不知道这个脚本错误有多重要,但上述更改让我取得了进步。

我还链接到另一个有更多细节的线程。 https://ez.analog.com/sw-interface-tools/f/qa/534115/pyadi-iio-operation-in-gnuradio-3-8/404723#404723

再次感谢

于 2021-02-08T10:38:04.197 回答