我正在尝试为使用32位Python二进制文件的64位Redhawk开发一个组件,但我不确定如何配置Redhawk在运行此特定组件时使用32位Python而不是64位Python。我需要使用32位Python的原因是因为我使用的是一个只适用于32位Python的库(PyVisa,http://pyvisa.readthedocs.org/en/latest/)(参见https://decibel.ni.com/content/docs/DOC-2928)。
我正在使用PyVisa来控制实验室设备(即安捷伦信号发生器),以便校准接收器。我知道这看起来似乎是对Redhawk的一种奇怪用法,但是将sig gens调整到某个频率和功率水平非常类似于在控制接收器/发射器时需要执行的操作。
我宁愿不安装32位CentOS来开发和测试这个1组件,我假设在我的系统上同时安装32位和64位Redhawk转换器也同样麻烦。
我已经在我的系统上同时使用64位Python安装了32位Python,并手动将32位Python二进制文件重命名为“python_32”并将其放在路径(/ usr / bin /)上。我试图通过将实现文件顶部的shebang更改为
来强制Redhawk使用32位Python可执行文件#!/ usr / bin / env python_32
然而,它没有用,所以我试过
#!的/ usr / bin中/ python_32
也没用。
请参阅下面的示例了解骨架实现,为清楚起见,删除了所有样板导入和函数def。
#!/usr/bin/python_32
import visa
def process(self):
sg = visa.instrument("TCPIP::10.2.8.236")
print sg.ask("*IDN?")
return NORMAL
每次尝试启动包含此组件的简单波形时,都会收到以下错误。这与我在64位Python中使用PyVisa库时收到的错误相同,这就是为什么我认为Redhawk忽略了指定32位Python路径的shebang语句。
OSError: /usr/local/vxipnp/linux/bin/libvisa.so.7: wrong ELF class: ELFCLASS32
Traceback (most recent call last):
File "/var/redhawk/sdr/dev/.DevMgr_orion/GPP_orion/components/sendSCPI/python/sendSCPI.py", line 9, in <module>
import visa
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/visa.py", line 237, in <module>
resource_manager = ResourceManager()
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/vpp43.py", line 85, in __new__
it.init(*args, **kwds)
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/visa.py", line 230, in init
self.session = self.vi = vpp43.open_default_resource_manager()
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/vpp43.py", line 788, in open_default_resource_manager
visa_library().viOpenDefaultRM(byref(session))
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/vpp43.py", line 162, in __call__
self.load_library()
File "/usr/lib/python2.6/site-packages/PyVISA-1.5.dev0.dev-py2.6.egg/vpp43.py", line 131, in load_library
self.__lib = self.__cdecl_lib = cdll.LoadLibrary(path)
File "/usr/lib64/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/usr/lib64/python2.6/ctypes/__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/local/vxipnp/linux/bin/libvisa.so.7: wrong ELF class: ELFCLASS32
作为参考,我正在运行Redhawk 1.9.0版。 CentOS 6.4 x64上的x64。
如果有更好的方法通过Redhawk控制我的实验室设备,我也会对此持开放态度。
答案 0 :(得分:0)
可以将component.spd.xml文件中的<entrypoint>
更改为指向脚本而不是组件的.py文件。这对于为单个组件设置环境变量或重定向到其他程序非常有用。
考虑一下:
将<entrypoint>python/myComponent.py</entrypoint>
更改为<entrypoint>python/myScript.sh</entrypoint>
在python文件夹中创建一个名为myScript.sh的脚本。
使用以下内容填充myScript.sh:
export PYTHONPATH = $ PYTHONPATH#在这里添加/更改PYTHONPATH(或其他环境变量)
/ usr / bin / python_32 python / myComponent.py $ *
chmod + x myScript.sh
修改autotools文件,以便正确安装脚本(或只是手动复制)
这种方法让您可以更好地控制myComponent.py的运行方式。