Используйте SMO DLL в Python, используя win32com - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь использовать библиотеку SMO SQL Server из Python 2.7, используя pyWin32. Я могу импортировать win32com, но я зашел в тупик при любой попытке доступа к библиотеке. Код, который я пытаюсь использовать, приведен ниже.

import sys
sys.path.append(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies')
import win32com.client
server = win32com.client.Dispatch('Microsoft.SqlServer.Management.SMO.Server')

def main():
    print server

if __name__ == '__main__':
    main()

Когда этот код запускается, я получаю pywintypes.com_error: (-2147221005, 'Invalid class string', None, None).

Кажется вероятным, что я просто неправильно понимаю имя библиотеки при вызове Dispatch, но я не могу понять, каким оно должно быть.


Похоже, что это может быть проблема пути.

Это работает:

import win32api
win32api.LoadLibrary(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll')

Однако это не так:

import sys
sys.path.append(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies')
import win32api
win32api.LoadLibrary(r'Microsoft.SqlServer.Smo.dll')

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

В дополнение к ответу @ Pondlife, который является правильным для заданного вопроса, можно загружать сборки .NET в CPython, используя модуль Python для .NET и следующий код:

import clr
clr.AddReference("Microsoft.SqlServer.Smo")
from Microsoft.SqlServer.Management.Smo import Server

Чтобы это работало, мне нужно было вручную добавить путь к сборке к PYTHONPATH. Я не мог заставить его работать, используя sys.path.append.

1 голос
/ 09 декабря 2011

win32com предназначен для использования библиотек COM и ничего не знает о сборках .NET.В настоящее время нет возможности использовать .NET напрямую из CPython, поэтому вы можете использовать IronPython или написать инструмент командной строки на C # или как угодно, а затем вызвать его из Python.

...