sp_execute_external_script 找不到由 setuptools 安装的模块
sp_execute_external_script can't find modules installed by setuptools
我正在积极开发一个 Python 模块,我想将其部署在本地安装的 SQL Server 2017 中,因此我使用 setuptools
在 c:\Program Files\Microsoft SQL Server\<Instance Name>\PYTHON_SERVICES\Lib\site-packages
中部署该模块像这样:
"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
有了这个部署,我希望简单地 import
我刚刚通过 .egg-link
发布的模块进入 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
,但出现了同样的错误。
最后,我尝试按照 的建议将我的 <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
目录下
根据我广泛的实验,sp_execute_external_script
似乎不遵循符号链接(即通过 .egg-link
文件)。因此,开发模式安装将不起作用,无论您使用 setuptools
、pip
、pbr
还是其他任何方式。
我什至尝试将 <package_name>
文件夹作为 OS 符号链接进行符号链接。由于我在 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
,但绕过了中间文件和目录的创建。所以我将坚持使用这种简单但令人厌恶的方法。
我希望更有知识的人能提供更好的方法来解决这个问题。
我正在积极开发一个 Python 模块,我想将其部署在本地安装的 SQL Server 2017 中,因此我使用 setuptools
在 c:\Program Files\Microsoft SQL Server\<Instance Name>\PYTHON_SERVICES\Lib\site-packages
中部署该模块像这样:
"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
有了这个部署,我希望简单地 import
我刚刚通过 .egg-link
发布的模块进入 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
,但出现了同样的错误。
最后,我尝试按照 <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
目录下
根据我广泛的实验,sp_execute_external_script
似乎不遵循符号链接(即通过 .egg-link
文件)。因此,开发模式安装将不起作用,无论您使用 setuptools
、pip
、pbr
还是其他任何方式。
我什至尝试将 <package_name>
文件夹作为 OS 符号链接进行符号链接。由于我在 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
,但绕过了中间文件和目录的创建。所以我将坚持使用这种简单但令人厌恶的方法。
我希望更有知识的人能提供更好的方法来解决这个问题。