from win32com.client import Dispatchtry: comobj=Dispatch("Super_puperDLL.ComObject")except: print ("COM-объект не найден") sys.exit(1)
Спасибо за ответ, но речь не про COM, а про обычные .dll ( .so, если не ошибаюсь, в Юниксах). Так как Python великий тормоз, проще написать функции на каком либо реальном ЯП и скомпилировать в .dll, но встаёт вопрос как из Python вызывать эти функции, и можно ли вообще?
Цитата: Samovar от 27 Ноябрь 2016, 15:59:58Спасибо за ответ, но речь не про COM, а про обычные .dll ( .so, если не ошибаюсь, в Юниксах). Так как Python великий тормоз, проще написать функции на каком либо реальном ЯП и скомпилировать в .dll, но встаёт вопрос как из Python вызывать эти функции, и можно ли вообще?Самое простое использование ctypes:https://docs.python.org/3.5/library/ctypes.html#module-ctypes>>> from ctypes import *>>> print(windll.kernel32) <WinDLL 'kernel32', handle ... at ...>>>> print(cdll.msvcrt) <CDLL 'msvcrt', handle ... at ...>>>> libc = cdll.msvcrt Другой вариант здесь:http://blender-3d.ru/forum/index.php/topic,1529.0.htmlТретий вариант здесь:https://docs.python.org/3/extending/extending.htmlЧетвёртый вариант:https://ru.wikipedia.org/wiki/SWIGПятый вариант:https://habrahabr.ru/post/168083/
К моему предыдущему посту.Вот здесь что-то про FreeBasic, Python, ctypes:http://www.freebasic.net/forum/viewtopic.php?t=3946
А за это спасибо вдвойне! Это то, что нужно! Буду пробовать.
#include <iostream>#include <boost/python/def.hpp>#include <boost/python/module.hpp>using namespace std;namespace bp = boost::python;void say_greeting(const char* name){cout << "Hello, " << name << "!\n";}BOOST_PYTHON_MODULE(greet){bp::def("say_greeting", say_greeting);}
g++ greet_binding.cpp -I/usr/include/python3.4m -lboost_python3 -lpython3.4m -o greet.so -shared -fPIC
import greeta = greet.say_greeting("Eric")print (a)
и не пнонял почему эта команда (модуль... я особо не шарю) начинается с подчёркивания в Блендере?..
нихрена не работает... как в 2.49 так и в 2.78... ругается постоянно...
' This function adds two numbers (i've taken it from Freebasic manuel !)Function AddNumbers CDECL Alias "AddNumbers" ( ByVal operand1 As Integer, ByVal operand2 As Integer) As Integer Export AddNumbers = operand1 + operand2End Function ' This one shows uppercase text Function ShowText CDECL Alias "ShowText" (ByVal MyText As String) As Integer Export Print ucase(Mytext) Return 1End Function
#__ LOAD MODULE CTYPE __from ctypes import *#__ LOAD THE DLL __libFreeBasic = cdll.LoadLibrary("mydll.dll")#__ CALL FUNCION WITH INTEGER PARAMETER __print (libFreeBasic.AddNumbers(5,7))#__ CALL FUNCTION WITH STRING PARAMETER AND GET RETURN CODE__s_MyText = "Hello"c_MyText = c_char_p(s_MyText)RetCode = libFreeBasic.ShowText(s_MyText)RetMsg = "Return code : " + str(RetCode)print (RetMsg)
Traceback (most recent call last): File "C:\Users\Den\Desktop\FB\testdll.blend\Text", line 5, in <module> File "C:\Program Files\Blender Foundation\Blender\2.78\python\lib\ctypes\__init__.py", line 425, in LoadLibrary return self._dlltype(name) File "C:\Program Files\Blender Foundation\Blender\2.78\python\lib\ctypes\__init__.py", line 347, in __init__ self._handle = _dlopen(self._name, mode)OSError: [WinError 126] Не найден указанный модульError: Python script fail, look in the console for now...
OSError: [WinError 126] Не найден указанный модуль
' This function adds two numbers (i've taken it from Freebasic manuel !)Function AddNumbers CDECL Alias "AddNumbers" ( ByVal operand1 As Integer, ByVal operand2 As Integer) As Integer Export AddNumbers = operand1 + operand2End Function ' This one shows uppercase text Function ShowText CDECL Alias "ShowText" (ByVal MyText As String) As Integer Export 'Print ucase(Mytext) ScreenRes 400,400 Return 1End Function
>>> #__ LOAD THE DLL __>>> libFreeBasic = cdll.LoadLibrary("mydll.dll")Traceback (most recent call last): File "<blender_console>", line 1, in <module> File "I:\Programs64\Blender\blender-2.78-windows64\2.78\python\lib\ctypes\__init__.py", line 425, in LoadLibrary return self._dlltype(name) File "I:\Programs64\Blender\blender-2.78-windows64\2.78\python\lib\ctypes\__init__.py", line 347, in __init__ self._handle = _dlopen(self._name, mode)OSError: [WinError 126] Не найден указанный модуль>>> libFreeBasic = cdll.LoadLibrary(r"D:\moe\blender\Vopros\mydll.dll")>>> print (libFreeBasic.AddNumbers(5,7))12