如何从SQL Server SSMS执行托管在远程桌面的外部Python脚本文件
从SSMS通过存储过程调用远程桌面Python项目并捕获输出的实现方案
前置准备
- 远程桌面端Python环境配置完成,目标项目所在文件夹设置为网络共享,开放SQL Server运行账户的读取、执行权限
- SQL Server所在机器可通过UNC路径(格式为
\\远程桌面IP\共享文件夹名)正常访问远程桌面的共享目录 - 确保远程Python脚本无依赖路径硬编码,可通过命令行直接正常运行,print语句输出正常
实现步骤
1. 首次配置:启用xp_cmdshell组件
xp_cmdshell是SQL Server提供的执行系统命令的组件,仅首次配置需要执行如下SQL:
-- 开启高级配置选项 sp_configure 'show advanced options', 1; RECONFIGURE; -- 启用xp_cmdshell sp_configure 'xp_cmdshell', 1; RECONFIGURE;
安全提示:xp_cmdshell存在安全风险,生产环境建议使用完成后关闭,或仅对指定账户开放调用权限。
2. 创建调用Python脚本的存储过程
存储过程会自动执行远程Python脚本,并将print输出存入临时表后返回:
CREATE PROCEDURE dbo.RunRemotePythonProject AS BEGIN SET NOCOUNT ON; -- 替换为实际的远程Python解释器路径、目标脚本路径,路径含空格时必须用英文双引号包裹 DECLARE @RemotePythonExe NVARCHAR(200) = '"\\192.168.3.20\PyShared\python.exe"' DECLARE @TargetScriptPath NVARCHAR(500) = '"\\192.168.3.20\PyShared\my_project\main.py"' DECLARE @ExecCommand NVARCHAR(1000) = CONCAT(@RemotePythonExe, ' ', @TargetScriptPath) -- 创建临时表存储Python脚本输出(含print内容、报错信息) CREATE TABLE #PythonOutput ( LineContent NVARCHAR(4000) ) -- 执行命令并写入输出到临时表 INSERT INTO #PythonOutput EXEC xp_cmdshell @ExecCommand -- 返回所有非空的print输出,如需排查错误可去掉WHERE条件查看全部内容 SELECT LineContent AS PythonPrintOutput FROM #PythonOutput WHERE LineContent IS NOT NULL; DROP TABLE #PythonOutput; END
3. 执行存储过程获取输出
在SSMS的查询窗口直接执行如下命令即可得到Python脚本的所有print输出:
EXEC dbo.RunRemotePythonProject;
常见问题排查
- 若返回空结果,首先检查SQL Server服务的运行账户是否有远程共享目录的访问权限
- 若报错找不到路径,确认UNC路径书写正确,含空格的路径是否用双引号包裹
- 若脚本运行异常,去掉存储过程中查询临时表的WHERE条件,可查看Python的报错信息辅助排查
内容的提问来源于stack exchange,提问作者Prashant
相关产品推荐
相关产品推荐

