【发布时间】:2020-04-24 06:11:51
【问题描述】:
我正在积极开发一个 Python 模块,我想在本地安装的 SQL Server 2017 中进行部署,因此我将模块部署在 c:\Program Files\Microsoft SQL Server\<Instance Name>\PYTHON_SERVICES\Lib\site-packages使用 setuptools,如下所示:
"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供参考:
from setuptools import setup
setup(
setup_requires=['pbr'],
pbr=True,
)
这是对应的setup.cfg文件:
[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 脚本:
#uploader.py
class Upload:
pass
有了这个部署,我希望简单地将我刚刚通过.egg-link 发布的模块import 转换为sp_execute_external_script 调用,如下所示:
execute sp_execute_external_script @language= N'Python', @script= N'from <module_name>.uploader import Upload';
但是,从 SSMS 执行此存储过程会产生以下错误消息:
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_name 和Instance_Name。
我尝试使用install 命令而不是develop 只是为了确保.egg-link 文件没有问题。 install 在site-packages 中安装了.egg-info 文件,但我得到了同样的错误。
我也尝试从组合中删除 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.1 和setuptools 版本是44.0.0 和pbr 版本是5.4.4 并且我已经确认所有模块都安装在上面提到的site-packages 目录中。
【问题讨论】:
标签: python sql-server setuptools egg