在64位Redhawk中使用32位Python

时间:2013-11-20 01:27:25

标签: redhawksdr

我正在尝试为使用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控制我的实验室设备,我也会对此持开放态度。

1 个答案:

答案 0 :(得分:0)

可以将component.spd.xml文件中的<entrypoint>更改为指向脚本而不是组件的.py文件。这对于为单个组件设置环境变量或重定向到其他程序非常有用。

考虑一下:

  1. <entrypoint>python/myComponent.py</entrypoint>更改为<entrypoint>python/myScript.sh</entrypoint>

  2. 在python文件夹中创建一个名为myScript.sh的脚本。

  3. 使用以下内容填充myScript.sh:

    export PYTHONPATH = $ PYTHONPATH#在这里添加/更改PYTHONPATH(或其他环境变量)

    / usr / bin / python_32 python / myComponent.py $ *

  4. chmod + x myScript.sh

  5. 修改autotools文件,以便正确安装脚本(或只是手动复制)

  6. 这种方法让您可以更好地控制myComponent.py的运行方式。