1

我一直在使用 Python 通过一个作为 DLL 实现的插件来运行一个软件。这是通过以下包装类提供的:

from ctypes import *
import os

ANULL = -999999
gwbdll = None
if os.name == 'posix':
   gwbdll = cdll.LoadLibrary('libgwbplugin.so')
else:
   gwbdll = cdll.LoadLibrary('gwbplugin')

class GWBplugin:
   Name = "GWBplugin"
   def __init__(self):
      self.plugin = c_void_p (None)

   def initialize (self,app_name,file_name=None,cmds=None):
      return gwbdll.c_initialize(byref(self.plugin), c_char_p(app_name.encode()), file_name if file_name == None else c_char_p(file_name.encode()), cmds if cmds == None else c_char_p(cmds.encode()))

   def exec_cmd (self,uline):
      return gwbdll.c_exec_cmd(byref(self.plugin), c_char_p(uline.encode()))

   def results (self, value, units=None, ix=0, jy=0):
      type = c_void_p
      type_result = gwbdll.c_results(byref(self.plugin),c_void_p(None),c_char_p(value.encode()),c_char_p("DATATYPE".encode()),c_int(ix),c_int(jy))
      if type_result == 1:
         type = c_int
      elif type_result == 2:
         type = c_double
      elif type_result == 3:
         type = c_char_p
      else:
         return []
      
      count = gwbdll.c_results(byref(self.plugin),c_void_p(None),c_char_p(value.encode()),units if units == None else c_char_p(units.encode()),c_int(ix),c_int(jy))
      arr = (type*count)()
      gwbdll.c_results(byref(self.plugin),cast(arr,c_void_p),c_char_p(value.encode()),units if units == None else c_char_p(units.encode()),c_int(ix),c_int(jy))

      if type == c_char_p:
         arr = [x.decode('cp1252') for x in arr]

      return arr

   def destroy (self):
      gwbdll.c_destroy(byref(self.plugin))

   def __del__(self):
      gwbdll.c_destroy(byref(self.plugin))

我正在使用 Python 3.8.8 在 Jupyter 笔记本上运行我的程序,代码如下所示:

myPlugin = GWBplugin()
myPlugin.initialize("react", f_out, f_in_flagged)

其中“react”是我在该软件中使用的特定应用程序的名称,f_out 看起来像“Output Files/pH 9/Reduced/0.0% Reduced/Output_6.txt”,f_in_flagged 看起来像“-i 'Input Files/ pH 9/减少/0.0% 减少/Input_6.rea'"。

这包含在一个循环中,该循环遍历许多不同的输入文件,并且运行得很好,直到几天前我生成了更多输入文件(包含在一些新的子目录中)来运行,现在它吐出了以下错误:

OSError                                   Traceback (most recent call last)
<ipython-input-6-fdf290a73be1> in <module>
     24 #         #Initialize: Application, Output file, Input file containing setup
---> 25         myPlugin.initialize("react", f_out, f_in_flagged)
     26         #Run
     27         myPlugin.exec_cmd("go")

C:\Program Files\Gwb\src\GWBplugin.py in initialize(self, app_name, file_name, cmds)
     15 
     16    def initialize (self,app_name,file_name=None,cmds=None):
---> 17       return gwbdll.c_initialize(byref(self.plugin), c_char_p(app_name.encode()), file_name if file_name == None else c_char_p(file_name.encode()), cmds if cmds == None else c_char_p(cmds.encode()))
     18 
     19    def exec_cmd (self,uline):

OSError: exception: access violation reading 0x0000000000000000

我不太熟悉 C 或 ctypes,但据我所知,这与我提供的输入和输出文件的名称有关。我尝试返回并运行之前工作的原始目录中的文件(甚至尝试完全卸载并重新安装所有内容:软件、anaconda,并删除了所有新文件和目录),现在我遇到了同样的错误,所以超出了我真的不知道发生了什么。任何帮助是极大的赞赏!

4

0 回答 0