@YakovSava
Питонячий сишник

Вылет Python при возврате c_char_p из dll ctypes. Что не так?

Вообще понятия не имею что я делаю не так. Пытаюсь подгрузить dll для прочтения файла. В интернете ответов не нашёл, ChatGPT тоже не помог.
reader.cxx
# include <fstream>
# include <string>
using namespace std;

extern "C" __declspec(dllexport) const char* readfile(char* filename) {
	ifstream file;
	string lines, line;
	
	file.open(filename);
	if (file.is_open()) {
		while (file >> line) {
			lines += line;
		}
		file.close();
		return lines.c_str();
	} else {
		char* trashVar = "Bad open";
		return trashVar;
	}
}

loader.py
from ctypes import *

dll = cdll.LoadLibrary("./reader.dll")
dll.readfile.argtypes = [c_char_p]
dll.readfile.restypes = c_char_p
address = dll.readfile(b"filename.txt")
print(c_char_p(address).value) # Вот тут вылетает

Компиляция
clang++ -c -o reader.o reader.cxx
clang++ -shared -v -o reader.dll reader.o

Возможно, мне не хватает памяти на компьютере, а может проблема в другом. Может в том что я возвращаюсь const char* вместо char*?
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
У тебя возвращаемая переменная размещена на стеке. Возможно, string умирает по выходу из функции, и уносит с собой выделенную строку, так что указатель к моменту возврата из функции уже ни на что не указывает.

Если обратиться к функции из под C++, она сработает?
# include <fstream>
# include <string>
using namespace std;

const char* readfile(char* filename) {
  ifstream file;
  string lines, line;
  
  file.open(filename);
  if (file.is_open()) {
    while (file >> line) {
      lines += line;
    }
    file.close();
    return lines.c_str();
  } else {
    char* trashVar = "Bad open";
    return trashVar;
  }
}

int main()
{
    cout << readfile("filename.txt");
    return 0;
}
Ответ написан
DLL возвращает байтовую строку. Попробуй ее преобразовать в питоновскую:
print(address.decode(encoding="utf-8", errors="strict"))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы