私は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_flaged は「-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 にあまり詳しくありませんが、これは私がフィードしている入力ファイルと出力ファイルの名前と関係があると言えるでしょう。以前に機能していた元のディレクトリに戻ってファイルを実行しようとしました(ソフトウェア、アナコンダ、すべての新しいファイルとディレクトリを削除して、すべてを完全にアンインストールして再インストールしようとしました)が、同じエラーが発生しています。何が起こっているのか本当に途方に暮れていること。どんな助けでも大歓迎です!