Я пытаюсь передать имя файла из python в C \ C ++ .dll и заставить код C \ C ++ открыть / прочитать этот файл.
Вот очень простой пример того, что я пытаюсь добиться с помощью ctypes. Прошу простить меня за глупость моего кода на C ++. Я учусь здесь.
//C++ code in example.cpp compiled to example.dll
#include <stdio.h>
extern "C" {
char* _line;
char* test(char* txt){
FILE* f_name;
f_name = fopen(txt, "r");
//... read data from file and do something
_line = txt;
return _line; // this is just my sanity check to see if "file.txt" got passed from python
}
}
Я использую cygwin-64 для компиляции в .dll:
g++ -fPIC -shared example.cpp -o example.dll
Python оболочка:
import ctypes
print("works!") #just sanity check...
lib = ctypes.CDLL("example.dll")
cpp_file_access = lib.test
cpp_file_access.argtypes = [ctypes.c_char_p]
cpp_file_access.restype = ctypes.c_char_p
print(cpp_file_access(b"file.txt")) #sanity check to see if file name got passed
Когда test () в .dll вызывается из python, программа не проходит мимо строки:
f_name = fopen(txt, "r");
Независимо от того, какой метод я использую для открытия / доступа к указанному текстовому файлу. Он либо «зависает» и ничего не делает, либо выдает ошибку WindowsError, указывающую на нарушение прав доступа 0x00000 (...). То же самое происходит, когда я использую любую функцию «печати» в коде C ++, например:
printf("test print !");
std::cout << "another test print";
.dll-код работает в других случаях должным образом, если я не пытаюсь открыть / прочитать текстовый файл или "напечатать" что-то в консоли в коде C ++, который вызывается из python. На самом деле, когда я компилирую его в файл .exe, он открывает / читает файл и без проблем выводит все на консоль.
Я не могу найти решение / ответ своей проблемы. Может, кто-нибудь здесь сможет просветить меня, что я делаю не так?
[РЕДАКТИРОВАТЬ # 1] Я кое-что заметил. Когда я попытался запустить этот код в Python3 .8, я получил сообщение об ошибке, что файлы:
cygwin1.dll
cygstdc++-6.dll
cyggcc_s-seh-1.dll
не могут быть найдены, даже если они находятся в папке bin cygwin и путь env задан правильно. Мне пришлось скопировать и вставить эти файлы в папку, где были example.dll и python wrapper (wrapper.py). Я не знаю, имеет ли это какое-либо отношение к моей проблеме, но я думаю, что об этом стоит упомянуть. Я начинаю очень подозрительно относиться к этому компилятору cygwin. Копание продолжается.
[РЕДАКТИРОВАТЬ # 2] Я изменил код C ++, добавив void test_2 (), чтобы между python и .dll не передавались аргументы.
__declspec(dllexport) void test_2(){
FILE* f_name;
f_name = fopen("file.txt", "r");
}
И назовите его от python:
void_acc = lib.test_2
void_acc.restype = None
void_acc()
print ("program ended, go away !") // .. sanity check
Проблема осталась прежней. Выполнение программы останавливается, когда она достигает строки fopen ().