{"library":"saspy","title":"SASPy (SAS Python Interface)","description":"SASPy is an open-source Python package that provides an interface to the SAS System, allowing Python programmers to leverage their licensed SAS infrastructure. It enables bi-directional data exchange between pandas DataFrames and SAS datasets, submission of SAS code, and access to SAS analytical capabilities like machine learning and econometrics. Currently at version 5.105.1, the library maintains an active release cadence with frequent updates addressing new features, enhancements, and bug fixes.","language":"python","status":"active","last_verified":"Tue May 12","install":{"commands":["pip install saspy"],"cli":null},"imports":["import saspy\nsas = saspy.SASsession()"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import saspy\nimport pandas as pd\nimport os\n\n# NOTE: SASPy requires a configuration file (sascfg_personal.py) to define connection details.\n# This file is typically located in your Python site-packages/saspy directory or ~/.config/saspy/.\n# For example, using a 'winlocal' configuration (defined in sascfg_personal.py):\n# sas = saspy.SASsession(cfgname='winlocal')\n# If only one configuration is defined, or if running in an interactive environment that supports prompts:\nsas = saspy.SASsession()\n\nprint(f\"SAS Connection established: {sas.SASsessionid}\")\n\n# Example: Submit SAS code and get results\nresult = sas.submit(\"proc print data=sashelp.class(obs=5); run;\")\nprint(\"SAS Log:\\n\", result['LOG'])\nprint(\"SAS Listing:\\n\", result['LST'])\n\n# Example: Transfer a pandas DataFrame to SAS\ndata_df = pd.DataFrame({\n    'col1': [1, 2, 3],\n    'col2': ['A', 'B', 'C']\n})\n\nsas_data_obj = sas.dataframe2sasdata(data_df, 'WORK.mydata')\nprint(f\"DataFrame '{data_df.shape}' transferred to SAS library WORK as 'mydata'.\")\n\n# Example: Read SAS data back into a pandas DataFrame\nretrieved_df = sas.sasdata('mydata', libref='WORK').to_dataframe()\nprint(f\"Retrieved DataFrame head:\\n{retrieved_df.head()}\")\n\nsas.endsas()","lang":"python","description":"This quickstart demonstrates how to establish a connection to a SAS session, submit arbitrary SAS code, and exchange data between a pandas DataFrame and a SAS dataset. It highlights the importance of the `sascfg_personal.py` configuration file for defining SAS connection details.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-12","installed_version":null,"pypi_latest":"5.107.1","is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.1,"avg_import_s":0.16,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":6.4,"disk_size":"30.1M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":3.8,"import_time_s":0.09,"mem_mb":6.4,"disk_size":"31M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":7.6,"disk_size":"32.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":3.7,"import_time_s":0.18,"mem_mb":7.6,"disk_size":"33M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.19,"mem_mb":7.3,"disk_size":"24.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":2.4,"import_time_s":0.19,"mem_mb":7.3,"disk_size":"25M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.17,"mem_mb":7.4,"disk_size":"23.8M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":2.1,"import_time_s":0.17,"mem_mb":7.4,"disk_size":"24M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":6.3,"disk_size":"29.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"saspy","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":null,"install_time_s":3.7,"import_time_s":0.12,"mem_mb":6.3,"disk_size":"30M"}]}}