Trong topic https://daynhauhoc.com/t/hoi-ve-cach-ket-hop-nhieu-ngon-ngu-tren-1-project/ mọi người đã bàn về vấn đề này rồi nhưng em dùng Ubuntu nên không thể dùng file .dll mọi người hãy giúp em làm sao để tạo và sử dụng thư viện liên kết động trên Ubuntu. Em đang định làm cái project mà phần sử lí viết bằng C++ và phần giao diện bằng Python trên Ubuntu ạ
Kết hợp nhiều ngôn ngữ trong 1 project trên Ubuntu
Hi Stupid.
Code C++ thì hơi khó. Bạn có thể build ra file so từ mã nguồn C/C++ rồi gọi lại trong python.
Code C thì dùng https://docs.python.org/3/library/ctypes.html.
Code C++ thì phức tạp hơn http://www.boost.org/doc/libs/1_64_0/libs/python/doc/html/index.html
Trước tiên bạn tìm hiểu về CMake
Ubuntu dùng file dạng “lib{name}.so” để làm thư viện liên kết động và thường đặt tại /usr/lib hoặc /usr/local/lib
File lib đặt tại cùng folder của exec file không có ý nghĩa gì cả, khác với windows là .dll có thể đặt ngang hàng .exe
“File lib đặt tại cùng folder của exec file” Vẫn cấu hình để load được mà @_@!
Mặc định nó không load được bạn nhé.
Mình so sánh với windows chứ còn cấu hình cái gì LD_LIB…= ấy thì tính vô đây làm gì
Chả nhẽ 10 project, tạo cái nào lại add vào thì có mà mất công, copy thẳng vào /usr/lib or tạo folder lib riêng cho nhanh
:v Hên xui nha, lúc compile/linking thêm option rpath vào thì lúc chạy nó auto tìm runtime path được định trc.
Không thì thêm vài dòng vô ld.so.conf cũng được. :v
Cái này mình chưa tìm hiểu tới nhưng tóm váy lại thì vẫn cần setting, và nếu đưa sang máy khác thì có lẽ phải đặt đúng thứ tự ấy mới run được
Vậy khi import thư viện ấy vào python thì làm thế nào ạ
Vấn đề bạn nói chính là microservice, giải pháp ở dưới local là sử dụng Docker. Trên môi trường production, bạn sử dụng các dịch vụ cloud computing như AWS hoặc Windows Azure.
Hệ thống của Docker hay Cloud cung cấp các phần mềm CLI (Command Line Interface) để tương tác với các service trên Docker hoặc Cloud, từng trường hợp. Đặc biệt Azure cung cấp luôn bộ GUI (Graphical User Interface) để quản lý service trên Windows Azure, rất thân thiện.
Trong trường hợp của bạn, nếu sử dụng nhiều service, mỗi service sử dụng nền tảng ngôn ngữ khác nhau, nhưng chỉ deploy trên HĐH Ubuntu. Giải pháp cài đặt trên Ubuntu gặp vấn đề platform dependency, hay system dependency. Bạn sẽ giải tốn chi phí cho việc tạo môi trường trên các máy tính của developer, các máy tính của tester, thiết lập môi trường cho CI và cả môi trường production, lúc đó project cần bộ phận system admin để quản lý các thiết lập này. Trong khi nếu bạn triển khai theo Docker và Cloud thì bên Cloud Computing sẽ chịu trách nhiệm, team không cần phần system admin nữa.
Ngoài ra bạn có tìm hiểu về nghề mới cũng đang hot là DevOps, chuyên vận hành các hệ thống microservice như vấn đề bạn đang đề cập.
Mình chưa tìm hiểu nhiều về python nên không xác thực được đúng hay sai của link này,
Đại khái:
If you build your program as a shared library/DLL, you could use ctypes to call it.
import ctypes
print ctypes.windll.cprog.square(4) # windows
print ctypes.CDLL('cprog.so').square(4) # linux
Hi Dark.Hades.
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
Để chạy phần mềm trên linu thường gọi qua terminal. Mà thằng ternimal nó lại không tự cấu hình load thư viện. Thay vào đó cần cấu hình để nó load bằng tay
export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
hoặc ghi thêm vào file .bashrc.
P/S Folder hệ thống thì cũng là một biến môi trường thôi.
Em đã làm nhưng không được ạ, không biết tại em làm sai hay sao??? Mà thấy google cũng ít link về cái này quá
Build ra executable file cho nhanh :V xong qua python dùng subprocess gọi là xong, ez
Có 1 cách khác không phải dùng module ctypes
để load module là import
trực tiếp module đó bằng cách compile thành file có dạng <module_name>.so
(hoặc <module_name>.pyd
trên Windows), và dĩ nhiên là không hề dễ làm tí nào nhưng khi làm xong rồi thì sử dụng lại rất thoải mái.
Tìm hiểu cách mở rộng cho Python (Python2) tại: https://docs.python.org/2/extending/extending.html
Để mình cho bạn một ví dụ đơn giản:
// filename: cpmod.c
// compile_cmd:
// gcc cpmod.c -shared -o cpmod.so -lpython2.7 -I /usr/include/python2.7/ -fPIC
#include <stdio.h>
#include <string.h>
#include <Python.h>
#ifdef __cplusplus
// f@ck C++ compiler
// Google keyword: "mangling name c++"
extern "C" {
#endif
// C functions with Python object:
PyObject *say_hello(PyObject *self) {
printf("%s: Hello world!\n", __func__);
return Py_True;
}
PyObject *get_name(PyObject *self) {
char name[100];
fgets(name, 100, stdin);
name[strlen(name) - 1] = '\0'; // drop newline
return Py_BuildValue("s", name);
}
// Define module methods:
static PyMethodDef ModuleMethods[] = {
{"say_hello", (PyCFunction) say_hello, METH_NOARGS, "This is description"},
{"get_name", (PyCFunction) get_name, METH_NOARGS, "Just get a name :3"},
{NULL, NULL, 0, NULL}
};
// Init module for Python interpreter:
// Name of this function MUST be: init<name_of_libarary_in_so>
// Example: initcpmod() -> module name must be 'cpmod.so'
PyMODINIT_FUNC initcpmod() {
Py_InitModule("cpmod", ModuleMethods);
}
#ifdef __cplusplus
}
#endif
Compile bằng gcc
như trong chú thích ở đoạn code trên. Nhớ cài package python-dev
trước, phiên bản Python để compile là Python2.7
Tét thử nào:
>>> import cpmod
>>> cpmod.say_hello()
say_hello: Hello world!
True
>>> print "enter your name: ",; name = cpmod.get_name()
enter your name: Do Nam Trung
>>> name
'Do Nam Trung'