Найти - Пользователи
Полная версия: Не выводит в файл библиотека на C
Начало » Python для новичков » Не выводит в файл библиотека на C
1
RinatV
Доброго времени суток.
Поймав кураж почитав Ваш форум, сделал первую програмку на питоне, велосипедную возможно, т.к. для нормализации имеется библиотеки “Красивый суп”, mxTidy. Но к сожалению она не работает.
Программа последством модуля dl вызывает функцию из динамической библиотеки, которую тоже впервые создал почитав firststeps.ru, вообще под Линуксом впервые пытаюсь физически полезную программу делать.

функция библиотеки принимает имена обрабатываемого и результирующего файла и обрабатывает функциями из libtidy
короче нормализует html, все вроде бы работает, для проверки даже написал программу на C которая функционирует нормально

программа на питоне не записывает в результирующий файл.

Вот ссылка на скачивание (2041 байт в архиве c-api.zip) http://depositfiles.com/files/813pe9szh содержатся код питона и Си также команды мной использованные и файл данных

подскажите пожалуйста, где моя ошибка или можно другой способ передачи строки из кода C в python
версия питона IDLE 2.6.2.

import dl
a=dl.open("./myTidy.so")
a.call("fileTidy","./file.txt","./file3.txt")
a.close()

gcc -fPIC -c myTidy.c
gcc -shared myTidy.o /usr/lib/libtidy-0.99.so.0 -o myTidy.so
gcc main.c -o main -ldl
./main

//myTidy.c
#include <tidy/tidy.h>
#include <tidy/buffio.h>
#include <stdio.h>
#include <errno.h>
int fileTidy(const char* fInput,const char* fOutput)
{
printf("ok");
int ret=0;
char* input = "<title>Foo<title>FooBoby";
FILE* f=fopen(fInput,"r");
if (f!=0)
{
fseek(f,0,SEEK_END);
long n=ftell(f);
input=malloc(n+1);
input[n]=0;
fseek(f,0,SEEK_SET);
fread(input,n,1,f);
close(f);
}
else return ret;



TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
Bool ok;

TidyDoc tdoc = tidyCreate(); // Initialize "document"

ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes ); // Convert to XHTML
if ( ok )
rc = tidySetErrorBuffer( tdoc, &errbuf ); // Capture diagnostics
if ( rc >= 0 )
rc = tidyParseString( tdoc, input ); // Parse the input
if ( rc >= 0 )
rc = tidyCleanAndRepair( tdoc ); // Tidy it up!
if ( rc >= 0 )
rc = tidyRunDiagnostics( tdoc ); // Kvetch
if ( rc > 1 ) // If error, force output.
rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
if ( rc >= 0 )
rc = tidySaveBuffer( tdoc, &output ); // Pretty Print

if ( rc >= 0 )
{
FILE* w=fopen(fOutput,"w");
if(w!=0)
{
fprintf(w,"%s",output.bp);
close(w);
ret=-1;
}
}

tidyBufFree( &output );
tidyBufFree( &errbuf );
tidyRelease( tdoc );
free(input);
return ret;
}

//main.c
#include <stdio.h>

/* заголовочный файл для работы с динамическими библиотеками */
#include <dlfcn.h>

int main(int argc, char* argv[]){

void *ext_library;// хандлер внешней библиотеки
double value=0;// значение для теста
double (*fileTidyFunc)(const char* fInput,const char* fOutput);// переменная для хранения адреса функции

//загрузка библиотеки
ext_library = dlopen("./myTidy.so",RTLD_LAZY);
if (!ext_library){
//если ошибка, то вывести ее на экран
fprintf(stderr,"dlopen() error: %s\n", dlerror());
return 1;
};

//загружаем из библиотеки требуемую процедуру
fileTidyFunc = dlsym(ext_library, "fileTidy");
value=3.0;

//выводим результат работы процедуры
(*fileTidyFunc)("./file.txt","./file3.txt");

//закрываем библиотеку
dlclose(ext_library);
};
Андрей Светлов
замените dl.open на ctypes
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB