Asynchronous, non-blocking SAP NetWeawer RFC SDK client bindings for Python.
- Stateless and stateful connections (multiple function calls in the same ABAP session / same context)
- Sequential and parallel calls, using one or more clients
- Automatic conversion between Python and ABAP datatypes
- 🆕 Throughput monitoring
Python 3
Windows 10 and macOS >= 10.15 supported by pre-built wheels and build from source installation
Linux wheels are supported by build from source installation only
Prebuilt Centos wheels are attached to the latest release on GitHub
Pre-built portable Linux wheels
are not supported, neither issues related to portable Linux wheels
❗ must not be distributed with embedded SAP NWRFC SDK binaries, only private use permitted
Platforms supported by SAP NWRFC SDK can be supported by build from source
SAP NWRFC SDK 7.50 PL3 or later must be downloaded (SAP partner or customer account required) and locally installed
- Using the latest version is recommended as SAP NWRFC SDK is fully backwards compatible, supporting all NetWeaver systems, from today S4, down to R/3 release 4.6C.
- SAP NWRFC SDK overview and release notes
Build from source on older Linux systems, may require
uchar.hfile, attached to SAP OSS Note 2573953, to be copied to SAP NWRFC SDK include directory
Visual C++ Redistributable Package for Visual Studio 2013 is required for runtime, see SAP Note 2573790 - Installation, Support and Availability of the SAP NetWeaver RFC Library 7.50
Build toolchain for Python 3 requires Microsoft C++ Build Tools, the latest version recommended
Build toolchain for Python 2 requires Microsoft Visual C++ 9.0
❗ Due to a change introduced with Python 3.8 for Windows, PATH directories are no longer searched for DLL. The SAP NWRFC SDK lib path is no longer required on PATH, for Python >= 3.8.
- The macOS firewall stealth mode must be disabled (Can't ping a machine - why?):
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode offRemote paths must be set in SAP NWRFC SDK for macOS: documentation
When the node-rfc is started for the first time, the popups come-up for each NWRFC SDK library, to confirm it should be opened. If SDK is installed in admin folder, the node-rfc app shall be that first time started with admin privileges, eg.
sudo -E
Highly recommended reading about RFC communication and SAP NW RFC Library, published in the SAP Professional Journal (SPJ)
PYRFC_BUILD_CYTHON environment variable can be set to trigger Cython based build, overriding the default C based build from already cythonized CPP source.
Binary wheel installed if found on PyPI, fallback to build from source otherwise:
pip install pynwrfcBuild from source
pip install pynwrfc --no-binary :all: # or PYRFC_BUILD_CYTHON=yes pip install pynwrfc --no-binary :all:or
git clone https://github.com/SAP/PyRFC.git cd PyRFC python setup.py bdist_wheel pip install --upgrade --no-index --find-links=dist pynwrfc # set ABAP system parameters in test/pyrfc.cfg pytest -vvSee also the pyrfc documentation, complementing SAP NWRFC SDKdocumentation.
Note: The package must be installed before use.
In order to call remote enabled ABAP function module (ABAP RFM), first a connection must be opened.
frompyrfcimportConnectionconn=Connection(ashost='10.0.0.1', sysnr='00', client='100', user='me', passwd='secret')Connection parameters are documented in sapnwrfc.ini file, located in the SAP NWRFC SDK demo folder.
Using an open connection, remote function modules (RFM) can be invoked. More info in pyrfc documentation.
# ABAP variables are mapped to Python variablesresult=conn.call('STFC_CONNECTION', REQUTEXT=u'Hello SAP!') print (result){u'ECHOTEXT': u'Hello SAP!', u'RESPTEXT': u'SAP R/3 Rel. 702 Sysid: ABC Date: 20121001 Time: 134524 Logon_Data: 100/ME/E'} # ABAP structures are mapped to Python dictionariesIMPORTSTRUCT={"RFCFLOAT": 1.23456789, "RFCCHAR1": "A" } # ABAP tables are mapped to Python lists, of dictionaries representing ABAP tables' rowsIMPORTTABLE= [] result=conn.call("STFC_STRUCTURE", IMPORTSTRUCT=IMPORTSTRUCT, RFCTABLE=IMPORTTABLE) printresult["ECHOSTRUCT"]{"RFCFLOAT": 1.23456789, "RFCCHAR1": "A" ...} printresult["RFCTABLE"] [{"RFCFLOAT": 1.23456789, "RFCCHAR1": "A" ...}]Finally, the connection is closed automatically when the instance is deleted by the garbage collector. As this may take some time, we may either call the close() method explicitly or use the connection as a context manager:
withConnection(user='me', ...) asconn: conn.call(...) # connection automatically closed hereAlternatively, connection parameters can be provided as a dictionary:
defget_connection(conn_params): """Get connection"""print'Connecting ...', conn_params['ashost'] returnConnection(**conn_param) frompyrfcimportConnectionabap_system={'user' : 'me', 'passwd' : 'secret', 'ashost' : '10.0.0.1', 'saprouter' : '/H/111.22.33.44/S/3299/W/e5ngxs/H/555.66.777.888/H/', 'sysnr' : '00', 'client' : '100', 'trace' : '3', #optional, in case you want to trace'lang' : 'EN' } conn=get_connection(**abap_system) Connecting ... 10.0.0.1conn.aliveTrueSee also the pyrfc documentation, complementing SAP NWRFC SDKdocumentation.
If you encounter an issue or have a feature request, you can create a ticket.
Check out the SAP Community (search for "pyrfc") and stackoverflow (use the tag pyrfc), to discuss code-related problems and questions.
We appreciate contributions from the community to PyRFC! See CONTRIBUTING.md for more details on our philosophy around extending this module.