0

概括:

我设置了一个 python 脚本(在本例中进行了简化,删除了所有 ODBC/SQL 语句),它在子目录中创建了两个日志文件。然后我使用 PyInstaller 从这个名为 TestApp.exe 的文件中创建了一个 exe 文件。以 SQL 服务器代理用户的身份手动运行可执行文件。当 exe 文件在 SQL Server 中设置为作业步骤时,使用 CmdExec 函数,进程挂起,并且不会在使用任务管理器之外关闭。

我在“执行作业'TestApp'”上得到一个永久旋转的“开始工作”绿色圆圈

找出为什么批处理文件在不执行 exe 文件的情况下成功“运行”,并找出为什么直接指向时 exe 文件挂起,是我的目标。

本地虚拟盒子正在运行 Windows 10

正在使用 Windows Server 2016

SQL 服务器是版本 13.0.5292.0

正在使用 Python 3.6.6。

正在使用 PyInstaller 3.5。

我试过的东西:

我有其他几个执行 VB/shell 代码的 EXE 文件在同一目录中成功运行,设置完全相同。

我尝试使用 windows 任务调度程序来运行这个 exe 文件,并且得到了相同的结果。

我已经研究过更改路径以导致不同的错误(然后导致作业正确出错)。将用户所有者更改为具有不同权限设置的单独管理员用户会导致作业正确失败。

我试图在没有 SQL 作业的情况下手动作为单独的管理员用户运行,并且这些工作正常。

我试图将 exe 文件作为批处理文件作业运行:

启动 E:\SQLLoadFiles\TestApp\TestApp.exe

上面的批处理文件导致作业成功,但是exe文件永远不会运行。批处理文件在手动运行时(使用不同的目录指针,因为 E:\ 驱动器特定于 SQL Server 代理用户),它可以成功运行而没有问题。

我尝试将脚本简化为只创建简单的文件(将在下面看到)。

我尝试作为 SQL 服务器代理进行远程处理,并在同一 E:\ 驱动器位置手动运行可执行文件,它成功执行而没有问题。

我已确保 pyinstaller 未设置为使用 --noconsole 选项显示控制台,因为我听说在后台运行时可能会导致问题。

最后一点:当步骤挂起时,步骤/作业的历史不会显示作业正在运行。

作业/步骤的 SQL 设置:

 Type: Operating system (CmdExec)
 Run As: SQL Server Agent Service Account
 On success: Quit job reporting success
 On Failure: Quit the job reporting failure
 SQL CmdExec step command: E:\LoadingFiles\TestApp\TestApp.exe
 Or in batch format: E:\LoadingFiles\TestApp\Starter.exe
 Batch file code: start E:\LoadingFiles\TestApp\TestApp.exe

蟒蛇代码:

#Quite a few libraries removed
import datetime, csv, os.path, datetime
#Setup Logging here
now=datetime.datetime.now()
logfilename='FBlog_' + str(now.strftime('%Y-%m-%d_%H-%M-%S'))
#print(logfilename) \#removed as part of removing any console visibility
logfb=open('logs/%s.txt' % logfilename, 'w+')
startstring='Starting run ' + str(now.strftime('%Y-%m-%d_%H:%M:%S')) + '\n'
logfb.write(str(startstring))
logfb.close()

##########Application build code for pyinstaller:############
import PyInstaller.__main__
PyInstaller.__main__.run([
    '--name=%s' % 'TestApp',
    '--onefile',
    '--noconsole',
    '--clean',
    'TestApp.py'
])

我希望要么触发错误消息,要么让应用程序开始,创建日志文件,然后完成;关闭进程。

4

1 回答 1

1

发现了问题。显然与 SQL 服务器代理的用户上下文有关,我需要硬设置“启动”或工作目录。该选项不适用于 CmdExec,因此我将 CmdExec 切换到 Powershell:

启动 E:\LoadingFiles\TestApp\TestApp.exe -wo E:\LoadingFiles\TestApp

这解决了这个问题。由于工作目录设置为“\”(或其他什么,我找不到实际的默认工作目录),python 试图访问一个不存在的目录,因此作业挂起。

于 2019-09-06T20:33:24.343 回答