0

我正在尝试为使用 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 的一种奇怪用法,但是将信号发生器调整到某个频率和功率水平与控制接收器/发射器时需要执行的操作非常相似。

我宁愿不安装 32 位 CentOS 只是为了开发和测试这 1 个组件,我假设在我的系统上同时安装 32 位和 64 位 Redhawk rpms 会同样麻烦。

我已经在我的系统上同时安装了 32 位 Python 和 64 位 Python,并手动将 32 位 Python 二进制文件重命名为“python_32”并将其放在路径 (/usr/bin/) 上。我试图通过将实现文件顶部的 shebang 更改为来强制 Redhawk 使用 32 位 Python 可执行文件

#!/usr/bin/env python_32

但是,它没有用,所以我尝试了

#!/usr/bin/python_32

这也没有用。

请参阅下面的示例以获取骨架实现,为清楚起见,删除了所有样板导入和函数定义。

#!/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 忽略了我的 shebang 语句,该语句指定了 32 位 Python 的路径。

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 控制我的实验室设备,我也愿意。

4

1 回答 1

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 文件,以便正确安装脚本(或手动复制)

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

于 2013-11-25T19:06:59.613 回答