拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux下Python调用SAP RFC:pyrfc与NW RFC SDK实战指南

简介Linux环境下用Python连接SAP系统常需借助pyrfc与nwrfcsdk。该组件包正面向此类集成开发场景为需要安装配置SAP NW RFC SDK、并通过Python调用RFC功能的工程师提供了一整套可用文件。压缩包共含27个文件以头文件.h、C/C源码.c/.cpp、动态库.so、配置文件.ini和可执行工具为主整体大小约18.05MB能较好支撑pyrfc绑定的编译与运行时环境搭建资源发布后已有1384人学习使用适合正在搭建SAP RFC连接环境、需要排查nwrfcsdk配置问题的开发者参考。包内包含nwrfc750P_5-70002752的关键SDK组件如include头文件、bin目录下的RFC可执行工具以及用于签名校验和版本管理的元数据文件便于核对版本和完整性另附示例与文档目录便于快速对照接口调用方法结合SDK安装、环境变量设置到RFC函数调用等关键环节可帮助读者在企业级SAP集成与自动化运维场景中快速上手。 最近在Linux服务器上做SAP外围系统集成需要让Python应用直接调SAP里的RFC函数。跑通这条路的关键是pyrfc这个Python库而pyrfc底层又强依赖SAP官方发布的NW RFC SDKnwrfcsdk。中间踩了一串坑正好把从下载SDK到成功调用RFC的完整过程写下来给要做同类对接的同学参考。如果你手头有SAP系统又需要在Linux环境下用Python写脚本或者服务去查询物料、创建订单、同步主数据等这套方案是目前最直接的路子。它不像中间件方案那样需要额外部署一堆组件pyrfc本身就是SAP对外提供的Python绑定连接方式接近ABAP侧的RFC调用习惯学习成本相对低。下面从环境准备开始讲全程按我实际操作的顺序来。1. 整体思路与选型考量1.1 这套方案的本质是什么先理一下调用链。Python侧发起RFC调用走的是pyrfc封装好的接口pyrfc本身是Cython编写的扩展库它通过SAP官方提供的NW RFC SDKC/C动态库和SAP应用服务器建立连接最终在ABAP侧执行对应的函数模块FM。所以本质上pyrfc只是“翻译层”真正干活的是nwrfcsdk。这就是为什么你光用pip装一个pyrfc还不够还必须先装好对应版本的SDK并且让系统能找到它的动态库否则导入pyrfc就会报错。和SAP其他集成方式相比pyrfc更适合这种场景需要快速写一个Python服务直接调SAP里的BAPI或RFC函数且不想引入SAP PI/PO、云平台集成套件这类重量级中间件。它和RFC函数之间的映射很直接不需要额外定义接口模型参数以Python的数据结构传入返回结果也是字典和列表处理起来非常顺手。1.2 为什么不用别的方案很多人在选型时会纠结要不要用SAP Java ConnectorJCo、SAP .NET ConnectorNCo或者干脆走REST/OData我个人的判断标准是如果技术栈已经是Python占主导且外围系统只需要“调用几个RFC函数完成业务闭环”pyrfc就是成本最低的选择。JCo面向Java生态如果你没有Java服务引入它等于额外维护一套JVM应用。OData虽然有标准接口但很多老的RFC函数并不是已经暴露成OData服务的要额外开发网关服务。pyrfc的优势在于进程内调用部署简单脚本也可以直接跑运维负担小。当然如果你们需要处理大量异步消息、做复杂映射那可能需要更完整的企业集成平台这是另一套思路了。2. Linux环境准备与SDK安装2.1 环境清单我这里实测的部署环境是CentOS 7.9Python版本3.8。SDK用的是SAP NW RFC SDK 7.55这个版本目前兼容性比较好和PyRFC较新版本配合没有遇到版本不匹配的问题。操作系统CentOS 7.9x86_64Python3.8建议3.7以上不要用2.7了SAP NW RFC SDK7.55PyRFC2.5.x底层依赖gcc、make、python3-devel如果安装PyRFC时需要本地编译注意SAP官方发布的nwrfcsdk只提供64位版本所以你的Linux系统必须是x86_64架构。如果系统是ARM架构官方SDK默认不支持基本只能换方案。2.2 下载并安装nwrfcsdknwrfcsdk要从SAP官方软件渠道下载一般需要SAP S-user账号。下载页面里找“SAP NW RFC SDK”对应的Linux版本解压之后就是标准的目录结构包含lib、include等目录。我习惯把SDK放到/opt/nwrfcsdk这个路径一目了然。解压命令不复杂mkdir -p /opt/nwrfcsdk tar -xzf nwrfcsdk_xxx.tar.gz -C /opt/nwrfcsdk解压后检查一下lib目录核心文件是libsapnwrfc.so还会带一些ICU相关的动态库。这一步能不能找到正确的文件直接决定后面会不会报“找不到共享库”的错。2.3 配置SAPNWRFC_HOME与动态库路径安装完SDK之后最关键的是设置环境变量。PyRFC在导入时会去读SAPNWRFC_HOME这个环境变量所以要把它加到系统配置里同时还需要把SDK的lib目录加入动态库搜索路径。export SAPNWRFC_HOME/opt/nwrfcsdk export LD_LIBRARY_PATH$SAPNWRFC_HOME/lib:$LD_LIBRARY_PATH如果是临时测试直接在当前shell执行这两行。如果是长期使用建议写到/etc/profile.d/sapnwrfc.sh里cat /etc/profile.d/sapnwrfc.sh EOF export SAPNWRFC_HOME/opt/nwrfcsdk export LD_LIBRARY_PATH$SAPNWRFC_HOME/lib:$LD_LIBRARY_PATH EOF chmod x /etc/profile.d/sapnwrfc.sh这里有个细节如果系统里同时有多个版本的SDK很容易出现版本错乱。我的建议是只保留实际要用的那个SDK并把SAPNWRFC_HOME写死不要让它去猜。另外不要用软链接把SDK放到/usr/lib里除非你能确认所有动态库依赖都干净否则后续排查问题会比较累。3. Python端安装pyrfc并打通连接3.1 创建虚拟环境安装pyrfc强烈建议用虚拟环境不要让Python包污染系统环境。我这边用venvpython3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install pyrfc如果一切正常pip会直接装上pyrfc。此时先做一次导入测试python -c from pyrfc import Connection; print(ok)如果输出ok说明SDK路径和动态库都已经识别。如果这步就报错先不要急着调连接回到环境变量和SDK依赖那一步排查。3.2 连接参数与最小验证脚本SAP连接参数主要分两种应用服务器直连和消息服务器负载均衡。前者最常用参数包括ashost应用服务器地址、sysnr系统编号、client客户端、user用户名、passwd密码。下面是最小可运行脚本from pyrfc import Connection conn Connection( ashost192.168.10.10, sysnr00, client100, userRFCUSER, passwdPASSWORD ) print(conn.get_system_info()) conn.close()能打印出系统信息说明网络、账号权限、SDK、PyRFC整条链路都已经通了。这个脚本可以作为任何后续代码的“探针”先跑通它再往上层写业务逻辑。3.3 调用RFC函数的基础写法连接通了之后调用函数就很简单核心是conn.call方法from pyrfc import Connection conn Connection( ashost192.168.10.10, sysnr00, client100, userRFCUSER, passwdPASSWORD ) try: result conn.call(BAPI_COMPANY_GETLIST) for company in result.get(COMPANY_LIST, []): print(company) finally: conn.close()这里的BAPI_COMPANY_GETLIST是一个BAPI返回的COMPANY_LIST是一张表。pyrfc会自动把SAP的表转成Python的list每行是一个dict字段名和SAP结构里的字段名保持一致处理起来和操作普通JSON没有区别。带参数的调用也类似比如调用BAPI_MATERIAL_GETLIST时传MAXROWSresult conn.call(BAPI_MATERIAL_GETLIST, MAXROWS50)如果是结构参数直接传dict如果是行项目表传list of dict。这和SAP RFC的层级结构天然对应。4. 业务场景中的常见操作与注意事项4.1 参数、表结构与返回数据解析实际做业务集成时最花时间的往往不是连接而是参数映射。SAP RFC函数的输入输出参数有单值、结构、内表三层形态pyrfc里的映射规则是单值SCALAR直接传Python字符串、整数等。结构STRUCTURE用一个Python dict表示。内表TABLE用一个list of dict表示即使只有一行也要用list包起来。举一个实际的例子调用BAPI_GOODSMVT_CREATE做物料过账时需要传入抬头结构和行项目表header { PSTNG_DATE: 2025.01.10, DOC_DATE: 2025.01.10, HEADER_TXT: Python created } items [ { MATERIAL: MAT001, PLANT: 1000, STGE_LOC: 0001, MOVE_TYPE: 261, ENTRY_QNT: 10, } ] result conn.call( BAPI_GOODSMVT_CREATE, GOODSMVT_HEADERheader, GOODSMVT_ITEMitems, )很多BAPI需要先调用再根据返回值决定是否调用BAPI_COMMIT这点和SAP GUI里的操作逻辑一致。千万不要漏掉事务提交不然业务数据不会真正生效。4.2 连接配置管理别把密码写死在代码里不少同学的第一个测试脚本会把密码直接写在Python文件里这在你本机验证没毛病但一旦脚本要部署到服务器或者进Git仓库就是事故隐患。我的做法是用环境变量配合python-dotenv管理连接信息pip install python-dotenv项目目录下建.env文件SAP_ASHOST192.168.10.10 SAP_SYSNR00 SAP_CLIENT100 SAP_USERRFCUSER SAP_PASSWDCHANGE_MEPython里这样读取import os from dotenv import load_dotenv from pyrfc import Connection load_dotenv() conn Connection( ashostos.getenv(SAP_ASHOST), sysnros.getenv(SAP_SYSNR), clientos.getenv(SAP_CLIENT), useros.getenv(SAP_USER), passwdos.getenv(SAP_PASSWD), )同时把.env加入.gitignore避免误提交。如果公司有密钥管理平台优先从密钥服务里拉取密码这里只是一个通用做法。4.3 SAP侧权限与授权检查Python这边把参数都写对了但调用还是报权限错误这是最常见的坑之一。SAP的RFC调用其实也遵循ABAP权限体系用户的授权角色里必须包含S_RFC授权对象并且分配对应的函数组权限。简单说SAP端要创建一个专门给外围系统用的RFC用户不要拿业务人员账号来连。给这个用户分配的角色里加上RFC访问权限并限定允许调用的函数组范围。如果SAP Basis团队有自己的一套流程直接按他们的要求去申请就好。如果在调用时遇到RFC_AUTHORIZATION_FAILURE这类错误优先查SAP端用户的权限代码这边能做的事情不多。5. 常见问题速查与踩坑记录5.1 高频报错对照表这里整理了我实际遇到以及帮别人排查过的几类典型问题按报错关键词分类报错现象可能原因解决办法import pyrfc后提示找不到SDKSAPNWRFC_HOME未设置或设置错误检查环境变量是否生效确认SDK路径正确报错libsapnwrfc.so找不到LD_LIBRARY_PATH未包含SDK的lib目录在环境变量中追加$SAPNWRFC_HOME/lib报错版本不支持SDK版本和PyRFC版本不匹配换用SAP NW RFC SDK 7.55保持PyRFC升级到2.x较新版本RFC_COMMUNICATION_FAILURE网络不通、SAP系统未启动或防火墙拦截先测试SAP服务器端口默认33xx确认网络可达RFC_LOGON_FAILURE账号密码错、客户端编号错、账号锁定检查凭据联系SAP Basis确认账号状态RFC_AUTHORIZATION_FAILURE用户没有对应RFC权限在SAP端添加S_RFC授权中文乱码系统locale和SAP字符编码不一致检查服务器locale确保支持UTF-85.2 几个容易忽略的坑第一个坑CentOS系统缺少某些基础库。SDK里的动态库依赖glibc和ICU等系统库如果系统环境太精简比如最小化安装的服务器可能会出现Symbol not found之类的错误。解决方法是装好基础工具链yum install -y gcc make glibc-devel libicu-develUbuntu/Debian系则是apt-get install -y build-essential python3-dev libicu-dev第二个坑多个Python环境混用。因为pyrfc需要读取环境变量如果你用system python和venv来回切换很容易出现“明明pip装好了运行却找不到模块”的情况。建议每个项目独立虚拟环境在启动脚本里显式source环境变量文件不要依赖全局配置。第三个坑连接对象复用。部分场景下如果每次都新建连接SAP侧的会话会不断增长长时间运行后可能导致系统资源不足。轻量级脚本无所谓但如果是常驻服务建议用一个简单的连接池或至少复用同一个Connection对象在服务退出时统一close。5.3 一些实用排查习惯连接不上SAP时不要急着盯Python代码先在Linux命令行测试端口通不通telnet 192.168.10.10 3300SAP实例的网关端口通常是33xxxx对应系统编号。如果端口不通后面调RFC一定失败这不是PyRFC本身能解决的。PyRFC本身调试信息也很有用可以在日志里开启详细输出。我用的是标准logging模块把pyrfc相关logger级别调到DEBUG能看到更多底层连接细节import logging logging.basicConfig(levellogging.DEBUG)这样跑一次调用能直观看到请求发出去和响应返回的情况比盲猜快很多。最后再分享一个小技巧给pyrfc调用包一层简单的工具函数统一处理连接、异常、关闭避免每个业务脚本都重复写一段连接代码。踩过几次坑之后你会发现这层封装能省掉后续大量精力。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门