- 积分
- 3680
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 115
- 最后登录
- 1970-1-1
该用户从未签到
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 dnawujun 于 2014-12-31 23:26 编辑
今天与大家分享下如何用Python调用Flux的问题
这里讲的Python并非Flux自带的Jython环境,而是独立的Python环境
Flux安装目录中有个Api的目录,里面有用Excel、C、Matlab调用Flux的例子,唯独没有Python的,既然Python被称为胶水语言,本人就想着Python一定能够调用Flux。
有些朋友可能会问了,为毛不直接使用pyflux?因为pyflux是基于jython 2.2的,要二次开发个图形界面必须使用java的GUI库,而java的
GUI本人实在不敢恭维。我一直用PyQT做界面,那个方便啊爽啊谁用谁知道。所以需要采用外部调用的方式
这是第一讲,如何启动FluxServer
一. 开发环境:
1. Python 2.7 x64(x32也行,我这里用的是Anaconda,大家可以选择自己喜欢的
见h--t--t--ps://w-w-w.python.org/download/alternatives/)
2. PyCharm 4.0.3(这个IDE比较爽)
3. Cedrat Flux 11.2
二. Python调用C语言写的DLL
在讲如何用Python启动FluxServer前,先讲讲这个问题。
在Python 2.5之后,Python标准库中有个ctypes的东东,这东西可以让Python调用C语言写的dll。
先上个例子:
from ctypes import *
user32=CDLL(‘user32.dll’)
user32.MessageBoxW(0,u’你好’,u’例子’,0)
关键是这句CDLL(‘user32.dll’),这句加载user32.dll,之后就可以调用其中的函数了
也可以用cdll.LoadLibrary("user32.dll ")
参见Python 2.7 帮助文档15.17.1.1. Loading dynamic link libraries
三. ctypes数据类型
ctypes定义一些和C语言兼容的数据类型,
见Python 2.7 帮助文档15.17.1.4. Fundamental data types
四. 用Python启动FluxServer
用Python启动FluxServer的关键在于用ctypes去调用flux_mp.dll中的各种函数
Flux_mp.dll在Flux安装目录\Bin\dll\win64中(或者win32)。
该dll的导出函数说明参考Api\help\API_Flux_V11.2.doc,但是需要注意的是,这文档里面有些函数的说明有错,需要配合Api\win32\include\ flux_mp.h来看
涉及到启动FluxServer,有3个函数需要介绍
H_ERROR CEDCALL FMP_arg(TCHAR* argName,TCHAR* valArg , TCHAR** arg)
这个函数设置启动参数
参数说明:
argName:参数名称,字符串。各种参数见API_Flux_V11.2.doc
valArg:参数值,字符串
arg: 输出的参数,供FMP_startLocaleServer使用的,字符串指针
H_ERROR CEDCALL FMP_init(TCHAR* configFile,CEDINT32 debugFlag);
初始化,启动前必须先调用这个
参数说明:
configFile:配置文件,可以为空字符串
debugFlag:以调试模式还是发布模式启动
H_ERROR CEDCALL FMP_startLocaleServer(TCHAR* server,TCHAR* wrkDir,TCHAR** args,CEDINT32 nbArgs, CEDDWORD *serverUid);
参数说明:
server: 需要启动的FluxServer,字符串类型。比如”FLUX2D_11.2_32”、 “FLUXSKEWED_11.2_32”等。这些server可以在flux_mp.h中第59行可以找到,全部为宏定义
wrkDir: 工作路径,字符串类型
args: 启动参数,字符串数组。附加的参数,如内存给多大,用几个CPU,什么语言等
nbArgs: 上面那个args数组的个数,整数
serverUid:整数指针,函数执行无错误后,返回唯一的Server ID
1. 无参数直接启动
Import ctypes as _ct
import os
import platform
__FLUX_INSTALL_DIR = os.environ['INSTALLFLUX'] #使用环境变量找Flux的安装目录,Flux安装后会建立这个环境变量.
__arch = platform.architecture() #__arch[0]为当前使用的Python解释器的位数”64bit”或”32bit”
__FLUX_MP_PATH = __FLUX_INSTALL_DIR + r'\bin\dll\win' + __arch[0][:2] + r'\flux_mp.dll'
#flux_mp.dll的位数必须和当前Python一致,32bit的Python不能调用64bit的Flux_mp.dll,64bit的Python也不能调用32bit的Flux_mp.dll
__FLUX_MP = _ct.CDLL(__FLUX_MP_PATH)
errorId =__FLUX_MP.FMP_init("",0) #初始化
__serverUid = _ct.c_int()
errorId = __FLUX_MP.FMP_startLocaleServer("FLUX2D_11.2_64","C:\temp", 0, 0, _ct.byref(__serverUid))
这样就启动了一个啥也没干的Server,但是脚本执行完后并不会关闭FluxServer,这样只能用任务管理器结束之
所以一般在程序最后会调用FMP_stopServer结束之,函数很简单,参见API文档
2. 带参数启动
上面 的无参数启动,其实还是默认参数启动。比如Numeric Memory为600MB
CPU个数为系统全部的CPU个数,语言为英语等
这些信息可以在工作目录下查看*.log得到
下面以配置两个参数为例讲述:
LOCALEWRKDIR=r"D:\Work\Python\FluxAPI\TestProject"
NUMERICAL_MEMORY_LABEL = "MEMSIZN3"
LANGUAGE_LABEL="CAO_DEFLAN"
arg1= _ct.c_char_p()
herror = __FLUX_MP.FMP_arg(NUMERICAL_MEMORY_LABEL,"800000000",_ct.byref(arg1)) #配置Numerical Memory 为800000000字节
arg2= _ct.c_char_p()
herror = __FLUX_MP.FMP_arg(LANGUAGE_LABEL,"1",_ct.byref(arg2)) #配置语言为法语
herror=__FLUX_MP.FMP_init("",0) #初始化
serverUid= _ct.c_int()
args=(_ct.c_char_p*2)(arg1,arg2) #含有2个字符串指针的数组,这个关键
herror = __FLUX_MP.FMP_startLocaleServer("FLUX2D_LATEST",LOCALEWRKDIR,args,2,_ct.byref(serverUid))
__FLUX_MP.FMP_stopServer(serverUid)
好了,今天就到这里
附上我写好的Python文件,里面用类包装了下
|
评分
-
查看全部评分
|