【问题标题】:Pandas 0.19 Read_Excel and UNC AddressesPandas 0.19 Read_Excel 和 UNC 地址
【发布时间】:2022-01-12 19:07:10
【问题描述】:

我正在使用 SQL Server v2017。当他们安装机器学习时,它安装了 Python 3.5 和 Pandas 0.19。我正在尝试在网络驱动器上的文件上使用 read_excel。我可以在本地机器上运行脚本,但我有 Python 3.9 和 Pandas 1.35。该脚本在本地运行良好,但在使用 EXECUTE sp_execute_external_script 通过服务器执行时无法正常运行。我意识到可能有很多事情可能会导致问题,但我需要先排除 Pandas 版本。服务器是 locke 自己的,改变一些东西需要很多繁文缛节。

Pandas 0.19 read_excel 能否访问 UNC 地址上的 excel 文件。我知道较新的版本可以,但这将帮助我排除 Pandas 库是问题的根源。

【问题讨论】:

  • 欢迎来到 Stackoverflow。你可以在你的电脑上安装服务器版本并在本地测试吗?和/或要求服务器人员升级?

标签: python excel pandas


【解决方案1】:

(我在 MS 工作,我支持 SQL ML 服务)

您的问题的简短答案是 -

您将很难在 ML 服务中访问 UNC 路径。这在技术上是可行的,但复杂性使得它对许多人来说是不可行的。您没有显示您的代码或错误,但我可以向您保证,您的问题与 pandas 无关,并且您可能会收到关于无法“连接”的错误,因为我们默认禁用来自 ML 服务的出站网络流量。 .. 但如果你通过了,那么你可能会遇到身份验证错误。

你的问题的长答案是 -

SQL 2016 和 2017 - 我们使用本地“工人”帐户。默认名称(它们基于您的实例名称)是 MSSQLSERVER01,02,03...20。(默认有 20 个...还有一个 MSSQLSERVER00,但我们将忽略那个)。

Launchpad 服务由它的服务帐户(默认:NT Service\MSSQLLaunchpad)运行,它可以作为域帐户运行。但是,实际执行 R/Python 代码的并不是启动板。 Launchpad 启动 R 进程,并在 MSSQLSERVERXX 用户下执行此操作。正是那个用户在技术上运行您的代码,因此,是那个用户试图连接到您的 UNC 路径,而不是您登录 SQL 的用户。此用户是本地用户 - 无法跨 UNC 共享进行身份验证。这个问题归结为设计限制。

在 Windows 中,无法在您的 UNC 路径中提供用户名/密码(而在 Linux 中,您可以)。使用映射驱动器将不起作用,因为它们是本地到您的用户和登录会话。因此,其他用户(以及 MSSQLSERVERXX 用户)将无法访问一个登录用户的映射驱动器。

简而言之,如果您绝对想让它工作,则必须完全在您的网络共享上禁用身份验证。在 Windows 中,这不仅仅是向文件添加“EVERYONE”权限。您还必须允许 GUEST(或在 *nix 世界中,ANONYMOUS)访问文件共享。在所有最近的 Windows 版本中默认禁用此功能,您必须修改各种 gpos/注册表设置/等以允许这样做。这不是我的建议。

如果这是在 AD 环境中,理论上您还可以允许 SQL 主机的 COMPUTER 帐户,以便允许来自“计算机”的所有连接。同样,不太理想。

在 SQL 2019 中 - 我们摆脱了本地用户帐户,转而使用 appcontainers。这消除了对本地用户帐户的需求(大型组织中的许多客户对本地用户帐户有限制),并提供了额外的安全性,但与往常一样,更多的安全性会带来更多的复杂性。在这种情况下,如果您以域用户身份运行启动板服务,您的 R/Python 进程将作为 LAUNCHPAD 帐户执行(但在非常锁定的应用容器上下文中)。从理论上讲,您可以随后授予 AD 中的该服务帐户访问您的远程 UNC 共享的权限……但是,appcontainers 提供了对特定“权限”(而不是文件级权限)的更精细的控制。例如,至少在概念上,当您在手机上使用应用程序时,或者可能是 Windows 商店 UWP 应用程序时,它会询问“您是否要允许它访问您的相机?” - 这些权限层是 appcontainers 的东西可以提供。我们必须明确声明个人“能力”,并且由于我们必须首先考虑和解决的其他几个安全隐患,我们目前不声明访问 UNC 共享的能力。这也是目前的设计限制。

SQL 2016/2017 的上述可能性不适用于 SQL 2019,也将不起作用。

但是,对于所有人来说,虽然它可能并不理想,但我的建议和您的最佳选择是:

  • 重新考虑您正在执行此操作的方向。不要使用您的 SPEES (sp_execute_external_scripts) 代码来访问网络共享,而是考虑从 SQL 主机本身共享一个目录......这样,您至少不必允许 GUEST 访问,并且可以保留一定级别的权限.然后,您可以将所需的任何文件拖放到共享中,然后通过 SPEES 代码中的本地到该主机的路径(例如:C:\SQL_ML_SHARE\file.xel)访问它。

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 2019-02-26
    • 2020-01-20
    • 2014-07-25
    • 2019-09-14
    • 1970-01-01
    • 2016-04-27
    • 2019-01-04
    相关资源
    最近更新 更多