运行从pyinstaller创建的python可执行文件时挂起SQL作业步骤



摘要:

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

我在"执行作业'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 文件作为批处理文件作业运行:

start E:\SQLLoadFiles\TestApp\TestApp.exe

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

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

我尝试以 SQL Server 代理身份进行远程处理,并在相同的 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:LoadingFilesTestAppTestApp.exe
Or in batch format: E:LoadingFilesTestAppStarter.exe
Batch file code: start E:LoadingFilesTestAppTestApp.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'
])

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

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

Start E:\LoadFiles\TestApp\TestApp.exe -wo E:\LoadFiles\TestApp

这将修复此问题。由于 python 尝试访问不存在的目录,由于工作目录设置为"\"(或其他内容,我找不到实际的默认工作目录(,因此作业挂起。

最新更新