【问题标题】:Running xp_cmdshell in SQL Server to run python script. Xlwings portion throws 'Access is denied' error在 SQL Server 中运行 xp_cmdshell 以运行 python 脚本。 Xlwings 部分抛出“访问被拒绝”错误
【发布时间】:2022-07-06 16:30:41
【问题描述】:

我已经被这个问题困扰了一段时间,但如果我做对了 - 没有什么比这更好的了。 我正在尝试使用 xp_cmdshell 使用以下代码从 SQL Server 运行 python 脚本

EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO

EXEC xp_cmdshell '\python.exe "FilePath"'

EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE
GO

上面的代码运行良好 - 它运行 python 脚本(我可以说它运行是因为 python 脚本将我的一些数据保存在 Excel 表中)。在 python 脚本中,我有一段代码可以在 excel 表上进行一些格式化:

import xlwings as xw
# create an excel instance app object as a context manager to make sure files are closed safely
app = xw.App(visible = True)
# open Policies Comparison workbook
excel_book = app.books.open(fr'FilePath\Dummy_Name.xlsx')
# fetch active sheet 
ws = excel_book.sheets.active
# select Cell A1 and press Ctrl + A
tbl_range = ws.range("A1").expand('table')
# create table 
ws.api.ListObjects.Add(1, ws.api.Range(tbl_range.address))
# save and close workbook and app object
excel_book.save()
excel_book.close()
app.quit()

当我从 Python IDE(如 anaconda 提示符或 VSCode)运行此代码时,它运行完美。 但是,当我使用上面显示的命令 xp_cmdshell 从 SQL Server 调用 python 脚本时,它会失败并出现以下错误:

Traceback (most recent call last):
  File "E:\DataVision\Dev\PythonScripts\Policies Comparison vs Abacus and Eclipse.py", line 80, in <module>
    app = xw.App(visible = False)
  File "C:\Anaconda\lib\site-packages\xlwings\main.py", line 212, in __init__
    self.impl = xlplatform.App(spec=spec, add_book=add_book)
  File "C:\Anaconda\lib\site-packages\xlwings\_xlwindows.py", line 296, in __init__
    self._xl = COMRetryObjectWrapper(DispatchEx('Excel.Application'))
  File "C:\Anaconda\lib\site-packages\win32com\client\__init__.py", line 113, in DispatchEx
    dispatch = pythoncom.CoCreateInstanceEx(clsid, None, clsctx, serverInfo, (pythoncom.IID_IDispatch,))[0]
pywintypes.com_error: (-2147024891, 'Access is denied.', None, None)

我可以肯定地说,上述错误与上面的 xlwings 部分有关。那是因为如果我删除 xlwings 部分,我的 python 脚本中的剩余代码将正确运行。 从回溯中,我可以理解访问被拒绝。因此,我尝试了一些想法,例如使用 xw.App(visible = False) 而不是 xw.App(visible = True) 并尝试使用上下文管理器运行。但是这些功能很有效。
我是 xlwings 和 shell 命令的新手。我发现此错误与其他 stackoverflow 问题和答案中的 pywin32 库有关,如下所示: Win32com codes not working on IIS ImportError: No module named win32com.client

我假设 xlwings 库或 xp_cmdshell 对 pywin32 库进行了某种调用以执行上述操作。 我还发现这个库是一个用于与 Windows 对话的高级库,这表明我很难调试。因此,我正在寻求您的专家帮助。 我已经被这个问题困扰了一段时间,并且非常感谢一个可以探索的方向,或者帮助我找出我做错了什么。

【问题讨论】:

  • 当 SQL Server 原生支持运行 Python 时,为什么还要使用 xp_cmdshell
  • 我使用机器学习服务,发现它运行起来有点慢,而且抛出的错误消息也不是那么容易调试。我发现从 sql 代理作业调用 python 脚本是运行 python 脚本的好方法 - 但是我们最近一直在远离 sql​​ 代理作业,因为我们开始有几个作业一起运行。因此,找到一个简单的替代 sql 代理作业的方法。

标签: python pywin32 sql-server-2017 xlwings xp-cmdshell


【解决方案1】:

试试这个 sn-p 来获取这个错误的详细信息

import win32api
e_msg = win32api.FormatMessage(-2147024891)
print (e_msg.decode('CP1251'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多