首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sp_execute_external_script找不到安装工具安装的模块

sp_execute_external_script找不到安装工具安装的模块
EN

Stack Overflow用户
提问于 2020-01-07 01:35:21
回答 1查看 521关注 0票数 1

我正在积极开发一个Python模块,我希望在本地安装的SQL Server2017中部署该模块,因此我使用setuptoolsc:\Program Files\Microsoft SQL Server\<Instance Name>\PYTHON_SERVICES\Lib\site-packages中部署该模块,如下所示:

代码语言:javascript
复制
"c:\Program Files\Microsoft SQL Server\<Instance_Name>\PYTHON_SERVICES\python" setup.py develop

这将在我的项目根目录中生成一个.egg-info目录,并在上面提到的site-packages目录中生成一个.egg-link文件。.egg-link文件正确地指向我的项目根目录中的.egg-info目录,因此看起来setuptools工作正常。

下面是我的setup.py以供参考:

代码语言:javascript
复制
from setuptools import setup

setup(
    setup_requires=['pbr'],
    pbr=True,
)

下面是相应的setup.cfg文件:

代码语言:javascript
复制
[metadata]
name = <module_name>
description = <Module Description>
description-file = README.md
description-content-type = text/markdown

[files]
package_root = py/src

因为我只是想让管道工作,所以我在<project_root>/py/src中只有一个名为uploader.py的python脚本

代码语言:javascript
复制
#uploader.py
class Upload:
    pass

部署就绪后,我希望简单地将我刚刚通过.egg-link发布的模块import到一个sp_execute_external_script调用中,如下所示:

代码语言:javascript
复制
execute sp_execute_external_script @language= N'Python', @script= N'from <module_name>.uploader import Upload';

但是,从SSMS执行此存储过程会生成以下错误消息:

代码语言:javascript
复制
Msg 39004, Level 16, State 20, Line 10
A 'Python' script error occurred during execution of 'sp_execute_external_script' with HRESULT 0x80004004.
Msg 39019, Level 16, State 2, Line 10
An external script error occurred: 

Error in execution.  Check the output for more information.
Traceback (most recent call last):
  File "<string>", line 5, in <module>
  File "C:\SQL-MSSQLSERVER-ExtensibilityData-PY\MSSQLSERVER01\C08BB9A7-66B5-4B5E-AAFC-B0248EE64199\sqlindb.py", line 27, in transform
    from <module_name>.uploader import Upload
ImportError: No module named '<module_name>'

SqlSatelliteCall error: Error in execution.  Check the output for more information.
STDOUT message(s) from external script: 
SqlSatelliteCall function failed. Please see the console output for more information.
Traceback (most recent call last):
  File "C:\Program Files\Microsoft SQL Server\<Instance_Name>\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py", line 587, in rx_sql_satellite_call
    rx_native_call("SqlSatelliteCall", params)
  File "C:\Program Files\Microsoft SQL Server\<Instance_Name>\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py", line 358, in rx_native_call
    ret = px_call(functionname, params)
RuntimeError: revoscalepy function failed.

显然,我已经从错误消息中编辑了module_nameInstance_Name

我尝试使用install命令而不是develop命令,只是为了确保.egg-link文件不是问题。installsite-packages中安装了.egg-info文件,但我得到了相同的错误。

我还尝试从mix中删除pbr,但得到了相同的错误。

最后,我试着按照How can I use an external python module with SQL 2017 sp_execute_external_script?的建议将我的<project_root>添加到sys.path中,但也没有帮助。

因此,在这一点上,我不知道我可能做错了什么。

python版本是3.5.2,我不认为项目中需要__init__.py才能将其作为模块。在py/src中插入空白__init__.py也没有任何帮助。

我的pip版本是19.3.1setuptools版本是44.0.0pbr版本是5.4.4,我已经确认所有模块都安装在上面提到的site-packages目录下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-12 08:41:03

根据我的大量实验,sp_execute_external_script似乎不遵循符号链接(即通过.egg-link文件)。因此,无论您使用setuptoolspippbr还是其他任何工具,开发模式安装都不起作用。

我甚至尝试过将<package_name>文件夹作为操作系统的符号链接。因为我在Windows上,所以我在命令提示符上使用mklink /D命令在site-packages中符号链接/py/src/<package_name>。虽然命令执行正确,并且我可以在文件资源管理器中看到符号链接文件夹,但sp_execute_external_script无法检测到该包。这告诉我,sp_execute_external_script代码中可能有一些东西可以避免遍历符号链接。

我想知道是否有一种方法可以让它遍历符号链接。

唯一可行的解决方案是在它自己的目录下开发一个包的代码,所以在我的例子中是/py/src/<package_name>。然后,在运行exec sp_execute_external_script @language=N'python', @script=N'...'之前,将<package_name>文件夹复制到site-packages目录。

这在某种程度上等同于setup.py install,但绕过了中间文件和目录的创建。因此,我将坚持使用这种简单的--尽管令人讨厌的--方法。

我希望更有见识的人能提供更好的方法来解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59616530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档