当我从 SQL Server Agent 运行 脚本时,为什么我的 Python 脚本会失败?

Why does my Python script fail when I run it from SQL Server Agent?

我有一个 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?

这不是答案,但我要 post 我现在所做的。这是在截止日期前为客户准备的,所以我只是拼凑了一些东西。我将在几周后 post 进行更深入的分析。

首先我需要有一条通往 model.joblib 的绝对路径。那是我的错。我通常在 Jupyter Lab 工作,但忘记了那是必要的。

但是,这并没有完全解决问题。作业 运行 但它好像跳过了执行脚本,这很奇怪。最终的解决方案是在 SSIS 中使用执行进程任务来 运行 脚本,然后将代理作业从 CmdExec 更改为 SSIS 包,这使一切正常。

从 SQL 服务器调用时,您需要将 sys.exit(0) 作为最后一件事。我已经 运行 多次执行脚本,但在 SQL 服务器代理中执行失败。

我的工作一直是将 XYZ 包装在一个函数中。在下面你会得到除以零来显示 sql 服务器会给你错误信息。如果你删除它 故意错误你会看到 SQL 服务器成功。

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
)