繁体   English   中英

当我从 SQL 服务器代理运行时,为什么我的 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?

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

我的工作一直是将 XYZ 包装在 function 中。 在下面,您将得到除以零,以显示 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)

Go 提前检查一下它应该适用于您的:

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
)

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

第一件事是我需要有一个到 model.joblib 的绝对路径。 那是我的错。 我通常在 Jupyter Lab 工作,却忘记了这是必要的。

然而,这并没有完全解决问题。 作业运行了,但它就像跳过执行奇怪的脚本一样。 最终的解决方案是使用 SSIS 中的 Execute Process Task 来运行脚本,然后将代理作业从 CmdExec 更改为 SSIS package 并且一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM