ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

两个独立的Python引擎之间的通信

2019-10-05 13:55:21  阅读:232  来源: 互联网

标签:python python-2-7 abaqus


问题陈述如下:

我正在与Abaqus合作,这是一个分析机械问题的程序.它基本上是一个独立的Python解释器,有自己的对象等.在这个程序中,我运行一个python脚本来设置我的分析(所以这个脚本可以被修改).它还包含一种在接收外部信号时必须执行的方法.这些信号来自我在自己的Python引擎中运行的主脚本.

目前,我有以下工作流程:
当Abaqus脚本必须执行特定功能时,主脚本将布尔值设置为True,并将此布尔值选取到文件中. Abaqus脚本定期检查此文件以查看布尔值是否已设置为true.如果是这样,它会进行分析并对输出进行pickle,以便主脚本可以读取此输出并对其进行操作.

我正在寻找一种更有效的方式来通知其他进程开始分析,因为有很多不必要的检查正确知道.通过泡菜进行数据交换对我来说不是问题,但更有效的解决方案当然是受欢迎的.

搜索结果总是给我带有子进程等的解决方案,这是针对在同一个解释器中启动的两个进程.我也看过ZeroMQ,因为这应该可以达到这样的目的,但是我觉得这样做太过分了,想要在python中找到解决方案.两个解释器都运行python 2.7(虽然版本不同)

解决方法:

编辑:

像@MattP一样,我将添加我的理解陈述:

背景

我相信您正在运行名为abaqus的产品. abaqus产品包括一个链接的python解释器,你可以通过某种方式访问​​(可能通过在命令行上运行abaqus python 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程序代码中.基本上,您打开与正确的主机:端口组合的连接,并且您正在与服务器通信.发送一些数据,获取一些数据等.

这些东西大多是从在线示例代码中删除的.如果你开始挖掘任何东西,它应该看起来真的很熟悉.

这是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: all
interfaces), on the given port number (default: 2525). When a connection
is made to the socket, begins processing data.
"""



import argparse

parser = 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 SocketServer
import json

class 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 argparse

parser = 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 json
import socket

message = "I get all the best code 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:", message
s.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 3434
CLIENT: Creating socket...
CLIENT: Connecting to :3434.
CLIENT: Sending message: I get all the best code from stackoverflow!
CLIENT: Waiting for reply...
SERVER: 127.0.0.1 wrote:
I get all the best code from stackoverflow!
DO_WORK: Doing work with data!
I get all the best code 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库.

标签:python,python-2-7,abaqus
来源: https://codeday.me/bug/20191005/1856400.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有