sp_execute_external_script не может найти модули, установленные setuptools - PullRequest
1 голос
/ 06 января 2020

Я активно занимаюсь разработкой модуля 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 в моем проекте root и файл .egg-link в каталоге site-packages, упомянутом выше. Файл .egg-link правильно указывает на каталог .egg-info в моем проекте root, поэтому кажется, что 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

Поскольку я просто пытаюсь заставить сантехнику работать, у меня есть один python скрипт под названием uploader.py в <project_root>/py/src:

#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 устанавливает файл .egg-info в site-packages, но я получаю ту же ошибку.

Я также пытался удалить pbr из смеси, но получил ту же ошибку.

Наконец Я попытался добавить <project_root> к sys.path, как предложено Как я могу использовать внешний python модуль с SQL 2017 sp_execute_external_script? , но это тоже не помогло.

Итак, на данный момент, я понятия не имею, что я могу делать неправильно.

python версия 3.5.2, и я не думаю, что __init__.py требуется в проекте, чтобы он мог квалифицироваться как модуль. Вставка пробела __init__.py в py/src также не помогает.

Моя pip версия 19.3.1, setuptools версия 44.0.0 и pbr версия 5.4.4 и Я подтвердил, что все модули установлены в каталоге site-packages, упомянутом выше.

1 Ответ

0 голосов
/ 12 января 2020

Судя по моим обширным экспериментам, sp_execute_external_script не следует по символическим ссылкам (то есть через файл .egg-link). Поэтому установки в режиме разработки не будут работать, используете ли вы setuptools, pip, pbr или что-либо еще.

Я даже пробовал использовать символическую ссылку <package_name> в качестве символической ссылки ОС. Поскольку я на Windows, я использовал команду mklink /D в командной строке для символической ссылки /py/src/<package_name> внутри site-packages. Пока команда проходит правильно, и я вижу папку с символическими ссылками в проводнике, sp_execute_external_script не может обнаружить пакет. Это говорит мне о том, что, вероятно, в коде sp_execute_external_script есть что-то, что позволяет избежать обхода символьных c ссылок.

Интересно, есть ли способ сделать так, чтобы он проходил через символьные c ссылки.

Единственное работоспособное решение - разработать код пакета в своем собственном каталоге, поэтому в моем случае /py/src/<package_name>. Затем перед запуском exec sp_execute_external_script @language=N'python', @script=N'...' скопируйте папку <package_name> в каталог site-packages.

Это примерно эквивалентно setup.py install, но обходит создание промежуточных файлов и каталогов. Поэтому я собираюсь придерживаться этого простого - хотя и одиозного - подхода.

Я надеюсь, что кто-то более знающий предложит лучший способ решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...