Adalm Pluto连接到运行Linux Mint 20的笔记本电脑。尝试运行一个非常基本的Python脚本,却收到错误消息"TypeError:'Context‘object is not callable“。
之前确实有一个错误,因为Python无法找到iio.py模块,但通过更新bashrc脚本中的$PYTHONPATH变量修复了这个错误。
其他所有测试似乎都正常工作。Pluto本身看起来工作得很好,在Windows10上连接到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()TerminalOutput:
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()‘的行似乎导致了该错误。与冥王星的通信似乎正常(例如,如上所述设置了rf带宽,可以使用打印命令进行检查。此外,还可以通过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示例在同一章中提供,作为一种检查安装的方法。
发布于 2021-02-07 14:56:29
我假设您使用的是带有python绑定的libiio v0.21。不知怎么的,在版本0.19 (或者可能是0.20,我现在还不能获取源代码)到0.21之间,删除了弱引用的用法,这就引入了这个bug。(参见:https://github.com/analogdevicesinc/libiio/issues/648)我猜这意味着这个问题很有可能很快变得无关紧要。
尝试使用0.19,或者可以考虑两种不同的修复问题的方法,即编辑/home/bob/libiio/bindings/python/iio.py
第一种方法是通过在您自己中添加相关行,恢复到v0.19中的情况。
在"import abc“行后添加"import weakref”:
import abc
import weakref将类Device的init method中的行更改为:
self.ctx = weakref.ref(ctx)这对于演示代码的目的是有效的,但是我不认为它是完全正确的,因为弱引用在某种程度上违背了buffer对象创建新引用的目的。从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-08 18:38:04
Mark H,自从我发帖以来,我对这一点的理解有了很大的提高-但我非常确定你已经解决了这个问题。我将给出一些细节,希望它可以帮助其他人,因为上下文很重要。
我的目标是在Linux上获得一个适合1) Adalm Pluto,2) Python控制使用pyadi-iio和3) GNU无线电的工作环境。如果你像我一样想要这三个,它会增加额外的维度。
我得到的解决方案(感谢ADI的特拉维斯)是做两个更改-替换一个文件和更改它的名称- 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无线电工作。
我还没有遇到不起作用的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/q-a/534115/pyadi-iio-operation-in-gnuradio-3-8/404723#404723
再次感谢
https://stackoverflow.com/questions/65540523
复制相似问题