【问题标题】:Python3 C Library usagePython3 C 库使用
【发布时间】:2026-02-06 00:00:01
【问题描述】:

我正在尝试将 Python 程序从 Python 2.7 转换为 Python 3.5。该程序包括 C 库。 C 库的调用不再起作用,但不会引发错误消息。我必须改变它在 Python3 中的工作吗?

class Yasdi:
    """YASDI Wrapper fuer Python"""
    def __init__(self,yasdi_lib="libyasdi.so",maxDriverIDs=10,DriverNameBuffer=30):
        """Konstruktor
                Parameter:
                yasdi_lib = "libyasdi.so"       |erwartet Pfad zur yasdi Lib
                maxDriverIDs = 10               |Anzahl der max. moegleichen Schnittstellen
                DriverNameBuffer = 30           |Anzahl der max.Namenslaenge des Schnittstellennamens"""
        self.maxDriverIDs = maxDriverIDs
        self.DriverIDArray = array.array("L",[0]*self.maxDriverIDs)
        self.DriverNameBuffer = " "*DriverNameBuffer

        self.yasdi = ctypes.cdll.LoadLibrary(yasdi_lib)

    def yasdiGetDriver(self):
        """Gibt die Anzahl zur verfuegung stehender Schnittstellen zurueck"""
        result = self.yasdi.yasdiGetDriver(self.DriverIDArray.buffer_info()[0],self.maxDriverIDs)
        return result

    def yasdiGetDriverName(self,driverID):
        """Gibt den Namen eine Schnittstelle zurueck, zum Beispiel: COM1 oder /drv/ttyS0 etc.
                Parameter:
                driverID = erwartet Schnittstellnummer (z.B. 0)"""
        self.yasdi.yasdiGetDriverName(driverID,self.DriverNameBuffer,len(self.DriverNameBuffer))
        return self.DriverNameBuffer.replace("\x00","").rstrip().lstrip()

    def yasdiSetDriverOnline(self,driverID):
        """Setzt eine Schnittstelle(driver) online, Achtung: unter Linux muss die Schnittstelle freigegeben werden!
                Parameter:
                driverID = Nummer der Schnittstelle (Com1 = 0 etc.)
                Rueckgabe:
                0: bei Erfolg
                1: bei Fehler"""
        result = self.yasdi.yasdiSetDriverOnline(driverID)
        return result

    def yasdiSetDriverOffline(self,driverID):
        """Gibt die Schnittstelle wieder Frei
                Parameter:
                driverID = erwartet Schnittstellnummer (z.B. 0)"""
        self.yasdi.yasdiSetDriverOffline(driverID)

【问题讨论】:

  • 如果没有错误,“不再工作”是什么意思? 会发生什么?您要转换的代码在哪里?我们如何帮助实现零细节?
  • 我添加了一些代码 - 希望这会有所帮助!
  • 代码在 Python35 中运行,但对 C 库的调用没有返回正确的值。当我使用 Python 2.7 运行相同的程序时,一切运行良好。
  • 还是 Python3 中的 ctypes 或 C 数组有变化?

标签: python c python-3.x


【解决方案1】:

上面的代码很好 - 问题出在不同的部分。请注意 Python 3 中的字符串默认为 Unicode - 这是我的问题!

【讨论】:

    【解决方案2】:

    这取决于绑定的类型。如果它是 C 绑定,则必须将其调整为 Python 3 接口并重新编译。如果它是通过 ctypes 绑定的,您将需要检查该模块中的更改。

    【讨论】:

    • 我在上面包含了一个代码部分。对我来说似乎是 ctypes - 我必须改变什么?