Python 3.x adalm pluto的python安装问题-typeError

Python 3.x adalm pluto的python安装问题-typeError,python-3.x,pluto,Python 3.x,Pluto,Adalm Pluto连接到运行Linux Mint 20的笔记本电脑。 尝试运行一个非常基本的Python脚本时,出现错误“TypeError:“Context”对象不可调用” 确实有一个早期的错误,Python无法定位iio.py模块,但是通过更新bashrc脚本中的$PYTHONPATH变量修复了这个错误 其他测试似乎都正常工作。冥王星本身看起来运行良好,在Windows10上与卫星连接时表现出色 不知道如何进步。非常感谢任何指点 Python代码: # Import library im

Adalm Pluto连接到运行Linux Mint 20的笔记本电脑。 尝试运行一个非常基本的Python脚本时,出现错误“TypeError:“Context”对象不可调用”

确实有一个早期的错误,Python无法定位iio.py模块,但是通过更新bashrc脚本中的$PYTHONPATH变量修复了这个错误

其他测试似乎都正常工作。冥王星本身看起来运行良好,在Windows10上与卫星连接时表现出色

不知道如何进步。非常感谢任何指点

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
bob@SamsungLaptop:~$python“/home/bob/Documents/python scripts/Pluto/Pluto\u check\u installation.py”
回溯(最近一次呼叫最后一次):
文件“/home/bob/Documents/Python scripts/Pluto/Pluto\u check\u installation.py”,第8行,在
数据=sdr.rx()
文件“/usr/local/lib/python3.8/dist packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py”,第250行,在rx中
返回self.\uuurx\ucomplex()
文件“/usr/local/lib/python3.8/dist packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py”,第171行,在rx_复合体中
self._rx_init_channels()
文件“/usr/local/lib/python3.8/dist packages/pyadi_iio-0.0.7-py3.8.egg/adi/rx_tx.py”,第127行,在初始信道中
self.\uuurxbuf=iio.Buffer(self.\urxadc,self.\uuurx\u Buffer\u size,False)
文件“/home/bob/libiio/bindings/python/iio.py”,第1016行,在__
self.\u ctx=device.ctx()
TypeError:“上下文”对象不可调用
上面的Python代码也在解释器模式下运行,并且接受了直到最后一行的所有命令

已尝试使用其他示例脚本,但包含“sdr.rx()”的行似乎是导致错误的原因。 与冥王星的通信似乎功能正常(例如,如上所述设置射频带宽后,可以通过打印命令进行检查。此外,还可以通过usb连接或ip地址或ssh或PuTTY进行通信)。 libiio库似乎正常(例如,键入'iio_info-s'或'iio_info-u Pluto.local'正在工作)。 pyadi库似乎正常(例如,adi的导入工作没有错误)

安装: A) LinuxMint20和MonGUI(内核从v5.4更新到v5.8以解决另一个问题)。
B) libiio、libadad9361 iio和pyadi iio均由源代码生成,并按照Pydr()第5章进行安装。上述Python示例在同一章中提供,作为检查安装的手段。

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

尝试使用0.19或您可以考虑通过编辑/HOB/BB/LIIIO/BIDENS/Python /IIO,PY

两种不同的方法来修复问题。 第一个是通过将相关行添加回您自己中,恢复到v0.19中发生的事情

在“导入abc”行后添加“导入weakref”:

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

self.ctx = weakref.ref(ctx)
这对于演示代码来说是可行的,但是我认为这并不完全正确,因为weakref有点违背了缓冲区对象创建新引用的目的。从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.
由于weakref,如果删除对对象的非弱引用,则无法确保该对象仍然存在。从这个意义上讲,您可以尝试将所有“ctx()”替换为“ctx”。v0.21中应有3个实例。这也适用于我,是我目前首选的解决方案

警告:如果这是代码维护人员反复讨论的问题,那么可能会涉及到不太明显的问题,因此任何一个修复程序都可能只是在玩“打鼹鼠”游戏, 自从我发表文章以来,我对这一点的理解有了很大的提高,但我很肯定你已经解决了这个问题。我将给出一些细节,希望它能帮助其他人,因为上下文很重要

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

我得到的解决方案(多亏了模拟设备公司的特拉维斯)是做两个更改——替换一个文件和更改它的名称- A) 用weakref版本替换'iio.py'文件(从下面的链接) B) 将文件重命名为类似“weak_iio.py”的名称 C) 进入pyadi iio文件夹(ADI)并编辑两个文件(“rx_tx.py”和“context_manager.py”)。每个“导入iio”中的单行需要更改为“导入弱iio作为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
导入adi
sdr=adi.Pluto('ip:Pluto.local')
打印(目录(sdr.\U ctx))
打印(sdr.\u ctx.name)
打印(目录(特别提款权)
打印(目录(sdr.\u rxadc.ctx())
回溯(最近一次呼叫最后一次):
文件“travis_test2.py”,第6行,在
打印(dir(rx.\u rxadc.ctx())
名称错误:未定义名称“rx”
使用pipenv创建了一个虚拟环境,该脚本在其中运行时没有出错。所以,到目前为止,我不知道这个脚本错误有多重要,但是上面的更改让我能够继续前进

我还将链接到另一个包含更多细节的线程。


再次感谢

看来维护人员正在进行修复:进展不错!我没有提到iio命名冲突(我也觉得很沮丧),因为你没有在你的问题中提到它,也没有影响执行,所以我认为你已经以某种方式处理过了。不过,谢谢你发布了你对这个问题的解决方案,因为我相信
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