编辑:
像@MattP一样,我将添加以下我理解的语句:
背景
我相信您正在运行一种称为abaqus的产品。abaqus产品包含一个链接的python解释器,您可以通过某种方式访问它(可能通过
abaquspython foo.py在命令行上运行)。
您还需要在同一台计算机上安装单独的python。您正在开发代码(可能包括numpy / scipy)以在该python安装上运行。
这两个安装是不同的:它们具有不同的二进制解释器,不同的库,不同的安装路径等。但是它们位于同一物理主机上。
您的目标是使您编写的“普通python”程序能够与在“ Abaqus
python”环境中运行的一个或多个脚本进行通信,以便这些脚本可以在Abaqus系统中执行工作并返回结果。
解
这是基于套接字的解决方案。有两个部分,
abqlistener.py和
abqclient.py。这种方法的优势在于,它使用了定义明确的机制来“等待工作”。不轮询文件等。这是一个“硬”
API。您可以从运行同一版本python的同一台计算机上的进程,或者从另一台计算机,或者从另一版本的python,从ruby或C或perl甚至是COBOL,连接到侦听器进程。它允许您在系统中添加一个真正的“气隙”,因此您可以以最小的耦合来开发两个部分。
服务器部分是
abqlistener。目的是将某些代码复制到Abaqus脚本中。然后,abq进程将成为服务器,侦听特定端口号上的连接,并做出响应。是否发回回复。等等。
我不确定是否需要为每个作业进行设置工作。如果是这样,那将必须是连接的一部分。这只会启动ABQ,永久监听端口并处理请求。任何特定于作业的设置都必须是工作过程的一部分。(也许发送一个参数字符串,或者一个配置文件的名字,或者其他任何东西。)
客户部分是
abqclient。可以将其移至模块中,或仅复制/粘贴至现有的非ABQ程序代码中。基本上,您打开与正确的host:port组合的连接,并且正在与服务器通信。发送一些数据,取回一些数据,等等。
这些东西大多是从在线示例代码中删除的。因此,如果您开始研究任何东西,应该看起来很熟悉。
这是abqlistener.py:
# The below usage example is completely bogus. I don't have abaqus, so# I'm just running python2.7 abqlistener.py [options]usage = """abacus python abqlistener.py [--host 127.0.0.1 | --host mypc.example.com ] \ [ --port 2525 ]Sets up a socket listener on the host interface specified (default: allinterfaces), on the given port number (default: 2525). When a connectionis made to the socket, begins processing data."""import argparseparser = argparse.ArgumentParser(description='Abacus listener', add_help=True, usage=usage)parser.add_argument('-H', '--host', metavar='INTERFACE', default='', help='Interface IP address or name, or (default: empty string)')parser.add_argument('-P', '--port', metavar='PORTNUM', type=int, default=2525, help='port number of listener (default: 2525)')args = parser.parse_args()import SocketServerimport jsonclass AbqRequestHandler(SocketServer.baseRequestHandler): """Request handler for our socket server. This class is instantiated whenever a new connection is made, and must override `handle(self)` in order to handle communicating with the client. """ def do_work(self, data): "Do some work here. Call abaqus, whatever." print "DO_WORK: Doing work with data!" print data return { 'desc': 'low-precision natural constants','pi': 3, 'e': 3 } def handle(self): # Allow the client to send a 1kb message (file path?) self.data = self.request.recv(1024).strip() print "SERVER: {} wrote:".format(self.client_address[0]) print self.data result = self.do_work(self.data) self.response = json.dumps(result) print "SERVER: response to {}:".format(self.client_address[0]) print self.response self.request.sendall(self.response)if __name__ == '__main__': print args server = SocketServer.TCPServer((args.host, args.port), AbqRequestHandler) print "Server starting. Press Ctrl+C to interrupt..." server.serve_forever()这是
abqclient.py:
usage = """python2.7 abqclient.py [--host HOST] [--port PORT]Connect to abqlistener on HOST:PORT, send a message, wait for reply."""import argparseparser = argparse.ArgumentParser(description='Abacus listener', add_help=True, usage=usage)parser.add_argument('-H', '--host', metavar='INTERFACE', default='', help='Interface IP address or name, or (default: empty string)')parser.add_argument('-P', '--port', metavar='PORTNUM', type=int, default=2525, help='port number of listener (default: 2525)')args = parser.parse_args()import jsonimport socketmessage = "I get all the best pre from stackoverflow!"print "CLIENT: Creating socket..."s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print "CLIENT: Connecting to {}:{}.".format(args.host, args.port)s.connect((args.host, args.port))print "CLIENT: Sending message:", messages.send(message)print "CLIENT: Waiting for reply..."data = s.recv(1024)print "CLIENT: Got response:"print json.loads(data)print "CLIENT: Closing socket..."s.close()这是当我一起运行它们时打印的内容:
$ python2.7 abqlistener.py --port 3434 &[2] 44088$ Namespace(host='', port=3434)Server starting. Press Ctrl+C to interrupt...$ python2.7 abqclient.py --port 3434CLIENT: Creating socket...CLIENT: Connecting to :3434.CLIENT: Sending message: I get all the best pre from stackoverflow!CLIENT: Waiting for reply...SERVER: 127.0.0.1 wrote:I get all the best pre from stackoverflow!DO_WORK: Doing work with data!I get all the best pre from stackoverflow!SERVER: response to 127.0.0.1:{"pi": 3, "e": 3, "desc": "low-precision natural constants"}CLIENT: Got response:{u'pi': 3, u'e': 3, u'desc': u'low-precision natural constants'}CLIENT: Closing socket...参考文献:
argparse,
SocketServer,
json,
socket都是“标准”的Python库。



