static PyObject *foo_OpenInternet(PyObject *self, PyObject *args){
char *url;
unsigned long Context = 777;
if(!PyArg_ParseTuple(args, "s", &url)){
return NULL;
}
HINTERNET hSession = InternetOpen("Raw HTML Reader",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hHttp = InternetOpenUrl(hSession, url, NULL, -1L,
INTERNET_FLAG_RELOAD, Context);
return Py_BuildValue("s", hHttp);
}
korzystam z kompilatora Mingw, plik setup.py wygląda tak:
from distutils.core import setup, Extension
setup(name='foo',
version='1.0',
ext_modules=[Extension('foo', ['foo.c'])],
#options = {"py2exe": { "dll_excludes": ["wininet.dll"]}},
)
komenda "python setup build"
plik setup działa na pewno bo przy testowaniu funkcji typu "hello
world" ładnie kompiluje
w przypadku tej funkcji mam taki problem:
build\temp.win32-2.5\Release\foo.o(.text+0xb5):foo.c: undefined
reference to `InternetOpenA@20'
build\temp.win32-2.5\Release\foo.o(.text+0xe7):foo.c: undefined
reference to `InternetOpenUrlA@24'
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
skorzystałem z
"from internet import google
google.search(..."
znalazłem takie rozwiązanie:
If you're using dev-c++ or any sort of MinGW, add -lwininet to the
linker paramaters.
-l wininet
gdybym korzystał z g++ to może i by poszło jednak stosuje python setup
i nie bardzo wiem jak z tej rady skorzystać. A może jest błąd w samej
funkcji?
A #include <Wininet.h> w kodzie masz?
ATSD, wiesz, że w ten sposób to się pisze moduły C, a nie C++?
Łączenie C++ z Pythonem jest nieco bardziej skomplikowane.
>> from distutils.core import setup, Extension
>> setup(name='foo',
>> version='1.0',
>> ext_modules=[Extension('foo', ['foo.c'])],
>> #options = {"py2exe": { "dll_excludes": ["wininet.dll"]}},
>> )
>>
>> komenda "python setup build"
>>
>> plik setup dzia�a na pewno bo przy testowaniu funkcji typu "hello
>> world" �adnie kompiluje
>> w przypadku tej funkcji mam taki problem:
>>
>> build\temp.win32-2.5\Release\foo.o(.text+0xb5):foo.c: undefined
>> reference to `InternetOpenA@20'
>> build\temp.win32-2.5\Release\foo.o(.text+0xe7):foo.c: undefined
>> reference to `InternetOpenUrlA@24'
>> collect2: ld returned 1 exit status
>> error: command 'gcc' failed with exit status 1
>
> A #include <Wininet.h> w kodzie masz?
Mi to linkerem pachnie ... jakiego� 'lib'-a trzeba zapoda� (byc mo�e
wininet.lib, nie wchodze w szczeg�ly).
Eee tam, to nie brak nagłówków. Błędy typu "undefined reference" to błędy
linkera. Tak jak Jacek Czerwiński mówi, trzeba dodać jakąś bibliotekę.
Michał Żarłok
nagłówki mam takie
#include <Python.h>
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
błędy linkera tak szczerze temat rozgryzam i jeszcze sie nie bardzo
orientuje z linkerami może jakaś podpowiedź.
byłbym wdzięczny za jakieś fachowe tutoriale łącznia pythona i C++
gdyż przeważnie to jest jednak C i po przerobieniu tych które
znalazłem to raczej mam mętlik.
jak widać dodałem -lwininet
potem python setup.py install
i moduł zainstalowany
help(foo) pokazuje metody itp.
co nie znaczy że kod działa jak należy.
muszę jednak poczytać o c++ i pythonie jak macie coś fajnego to bardzo
bym prosił.
dzięki.
> nag��wki mam takie
> #include <Python.h>
> #include <stdio.h>
> #include <windows.h>
> #include <wininet.h>
>
> b��dy linkera tak szczerze temat rozgryzam i jeszcze sie nie bardzo
> orientuje z linkerami mo�e jaka� podpowied�.
> by�bym wdzi�czny za jakie� fachowe tutoriale ��cznia pythona i C++
> gdy� przewa�nie to jest jednak C i po przerobieniu tych kt�re
> znalaz�em to raczej mam m�tlik.
Hej,
je�li dopiero zaczynasz nauk� tworzenia rozszerze� Pythona,
to musz� przyzna� �e trudniejszego przypadku nie mog�e� znale��. ;)
Mam na my�li po��czenie C++/MinGW/Windows. Ka�da inna konfiguracja
to pestka, ale ta jest do�� skomplikowana.
Jak jeszcze nie uciek�e� z krzykiem, to spr�buj� Ci to troch�
rozja�ni�. ;)
(Pisz� z pami�ci bo z Wind� nie mam za bardzo do czynienia)
Zgadza si�, �e Tw�j problem wzi�� si� z b��d�w linkowania,
czyli musisz dostarczy� linkerowi w�a�ciwych (czytaj: takich,
kt�rych mo�e uzy� MinGW) i wszystkich potrzebnych biblioteki import�w.
Zaczynamy od przeczytania stosownej dokumentacji:
http://docs.python.org/distutils/setupscript.html#library-options
http://docs.python.org/extending/building.html
Od razu rzuca nam si� w oczy, �e nasz `setup.py` m�g�by wygl�da� tak:
<code>
from distutils.core import setup, Extension
foo = Extension('foo',
include_dirs = ['C:/MinGW/include'],
library_dirs = ['C:/MinGW/lib'],
libraries = ['stdc++', 'wininet'],
sources = ['foo.c'])
setup(name='MojPakiet',
version='1.0',
ext_modules= [foo])
</code>
Zauwa�, �e skoro to ma by� C++, to musisz do linkowania do��czy�
bibliotek� `stdc++` (nie pami�tam, czy jak nazwiesz plik �r�d�owy
z rozszerzeniem ".cpp", to czasem nie jest odpalane g++, czyli wtedy
do��czanie stdc++ nie jest potrzebne).
No i oczywi�cie biblioteki, kt�re zawieraj� funkcje, kt�rych chcesz u�y�.
Przy tak zdefiniowanym `setup.py` MinGW b�dzie szuka� w "C:\MinGW\lib"
plik�w `libstdc++.a`, `libwininet.a` i `libpython25.a`,
kt�rych musisz mu dostarczy�. Je�li takowe nie istniej�, to musisz
je stworzy� w�asnor�cznie, a robisz to tak:
http://eli.thegreenplace.net/2008/06/28/compiling-python-extensions-with-distutils-and-mingw/
Czyli jak juďż˝ pobierzesz `pexports` odpalasz:
pexports C:\Python25\python25.dll > C:\MinGW\lib\python25.def
dlltool -d C:\MinGW\lib\python25.def -l C:\MinGW\lib\libpython25.a
pexports C:\Windows\wininet.dll > C:\MinGW\lib\wininet.def
dlltool -d C:\MinGW\lib\wininet.def -l C:\MinGW\lib\libwininet.a
`libstdc++` musi byďż˝ dostarczona z MinGW.
No i zapuszczasz kompilacj� z podaniem kompilatora, kt�rego chcesz u�y�:
http://docs.python.org/install/index.html
python setup.py build --compiler=mingw32
Jednak tak naprawdďż˝ to do takich zabaw zdecydowanie polecam `ctypes`:
http://docs.python.org/library/ctypes.html#module-ctypes
RW