首页 > 解决方案 > 当我从 SQL Server 代理运行 Python 脚本时,为什么它会失败?

问题描述

我有一个 python 脚本,当我在 IDE 中运行它时可以正常工作。如果我从命令行执行它,我必须在它所在的目录中才能正常运行。如果我尝试将其作为代理作业或在 SSIS 中使用执行流程任务运行,则会失败。

代理作业中的脚本如下所示:

py E:\Opt\AppDirectory\foo.py
SET EXITCODE = %ERRORLEVEL% 
IF %EXITCODE% EQ 0 ( 
   REM Script Ran Sucessfully
   EXIT 0
)
IF %EXITCODE% EQ 1 (
    REM Script Error
    EXIT 1
)

当我运行它或在 SSIS 中运行时,我得到:

Traceback (most recent call last):
  File "E:\Opt\AppDirectory\foo.py", line 76, in <module>
    encoder = jl.load('model.joblib')
  File "C:\ProgramData\Anaconda3\lib\site-packages\joblib\numpy_pickle.py", line
 590, in load
    with open(filename, 'rb') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'model.joblib'

model.joblib 与 foo.py 位于完全相同的目录中。当它说找不到文件时真的很奇怪,但我正盯着它看。

该作业可以找到 foo.py。为什么它似乎找不到model.joblib?

标签: pythonsql-serverbatch-filesql-server-2005sql-server-agent

解决方案


从 SQL SERVER 调用时,您需要将 sys.exit(0) 作为最后一件事。我遇到过很多次脚本执行良好但从 SQL Server 代理失败的情况。

我的工作一直是将 XYZ 包装在一个函数中。在下面,您将得到除以零,以显示 sql server 会给您错误消息。如果您有意删除该错误,您将看到 SQL Server 成功。

import sys

def test():
    try:
    
        x = 1/0
    
        if 1 > 0:
            return

    except BaseException as e:
        print(e)
        sys.exit(1)

test()
sys.exit(0)

继续检查它应该适用于您的:

py E:\Opt\AppDirectory\foo.py
SET EXITCODE = %ERRORLEVEL% 
IF %EXITCODE% EQ 0 ( 
   REM Script Ran Sucessfully
   EXIT 0
)
IF %EXITCODE% EQ 1 (
    REM Script Error
    EXIT 1
)

推荐阅读