【发布时间】:2020-07-15 01:21:42
【问题描述】:
我有一个 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 位于完全相同的目录中。当它说找不到文件时真的很奇怪,但我正盯着它。
job 可以找到 foo.py。为什么好像找不到model.joblib?
【问题讨论】:
-
请发帖minimal reproducible example。很可能 foo.py 脚本正在您当前的工作目录中运行,它只知道文件名,而不知道路径。在执行 python 脚本之前,您可以在批处理脚本中尝试
cd %~p0。 -
您知道您回答了自己的问题,对吧? “如果我从命令行执行它,我必须在它所在的目录中才能正常运行。” 换句话说,SQL 代理作业需要将目录更改为脚本在执行之前的位置。
-
@jwdonahue,这是复杂 NLP 过程的一部分,因此即使是可以复制的最小示例也是不可能的。但是,你确实给了我一个想法。我会试试你的方法。如果失败,我将使用绝对路径。
-
@AlwaysLearning 我确实尝试更改批处理脚本中的目录。它仍然不起作用,这是我变得比现在更加困惑的时候。当您在 IDE 中运行某些东西时,您是在文件所在的文件夹中运行它。所以我不知道代理在哪里运行脚本。
-
你能用脚本写一个日志文件吗?您可以转储整个环境和 cwd。或许能给你一些线索。我对该代理的工作原理一无所知,但它可能会为您的脚本提供非常有限的文件系统视图。您可能必须以某种方式“安装”您的文件或为其配置添加一些路径。除此之外,我的想法很新鲜。
标签: python sql-server batch-file sql-server-2005 sql-server-agent