[ Pobierz całość w formacie PDF ]
.W powyższym przykładzie interakcyjnym są trzy ważne punkty do zauważenia:l^D (Ctrl D) w wierszu zachęty interpretera powoduje powrót z interpretera Pythona do programu ebdemo.llsys.path nie zawiera bieżącego katalogu roboczego w ścieżce dostępu Pythona.Kiedy uruchamiamy program w Pythonie bez żadnych argumentów, to Python wstawia do sys.path specyfikacje katalogu dla wykonywanego programu (jeśli istnieją).W przykładzie ebdemo nie powiedzieliśmy Pythonowi, jaka jest nazwa programu, zatem jego ścieżka nie jest włączona do sys.path.llsys.argv nie został ustawiony, ponieważ przykład ebdemo nie ustawia tego.lMożemy skorygować te problemy, wprowadzając następujące zmiany do ebdemo.c:Py_SetProgramName(argv[0]);Py_Initialize();PySys_SetArgv(argc, argv);rc = PyRun_AnyFile(stdin,"???");Dodano wywołanie Py_SetProgramName, z przekazaniem arg[0] jako nazwy programu — musi to być zrobione przed wywołaniem Py_Initialize.Dodane zostało także wywołanie PySys_SetArgv z przekazaniem biężacych zmiennych argc i argv.Dokonane zmiany można przetestować, przebudowując ebdemo.c i go uruchamiając:$./ebdemo>>> import sys>>> print sys.path['.', '/usr/lib/python1.5/', '/usr/lib/python1.5/plat-linux-i386','/usr/lib/python1.5/lib-tk', '/usr/lib/python1.5/lib-dynload','/usr/lib/python1.5/site-packages']>>> print sys.argv['./ebdemo']>>> ^DJest wiele funkcji wysokiego poziomu dostępnych do wykonywania, analizy składniowej i kompilacji łańcuchów znakowych lub wykonywania plików.Pełny wykaz tych funkcji można znaleźć w dokumentacji do Pythona.Statyczna konsolidacja programu macierzystego z modułem rozszerzeniaZauważyliśmy powyżej, że program macierzysty, który nie oferuje żadnego poszerzenia możliwości Pythona nie jest zbyt użyteczny.Zobaczymy teraz jak skonsolidować statycznie moduł rozszerzenia z programem macierzystym.W tym szczególnym przykładzie, skonsolidujemy z plikiem sysinfo_wrap.c, który wyprodukowaliśmy przy użyciu generatora SWIG.Pierwszym krokiem w procesie konsolidacji jest zmodyfikowanie pliku Makefile w sposób następujący:ebdemo: ebdemo.o sysinfo.o$(CC) -o ebdemo ebdemo.o sysinfo.o $(PYTHONLIBS) $(LIBS)sysinfo.o:./sysinfo/sysinfo_wrap.c$(CC) $(CFLAGS) -c./sysinfo/sysinfo_wrap.c -o sysinfo.oebdemo.o: ebdemo.c$(CC) $(CFLAGS) -c ebdemo.cW tym szczególnym przykładzie, budujemy ebdemo w bliźniaczym katalogu sysinfo, gdzie rezyduje plik sysinfo_wrap.c.Plik Makefile wykorzystuje względną ścieżkę dostępu do pliku sysinfo_wrap.c.Trzeba wprowadzić dwie proste zmiany do pliku ebdemo.c:Po pierwsze, należy zadeklarować funkcję init jak zewnętrzną dla modułu sysinfo:#include "Python.h"extern void initsysinfoc();int main(int argc, char **argv)Następnie należy dodać wywołanie do procedury inicjalizującej moduł sysinfo:PySys_SetArgv(argc, argv);initsysinfoc();rc = PyRun_AnyFile(stdin,"???");Jesteśmy niemal gotowi do przetestowania tych zmian.Jednakże, jest jeszcze jeden krok, który trzeba uczynić zanim będzie można użyć moduł sysinfo.W tym miejscu warto sobie przypomnieć, że moduł sysinfo składa się zarówno z pliku sysinfo_wrap.c jak i pliku towarzyszącego (ang.shadow file) nazwanego sysinfo.py.Oba te pliki są produkowane przez generator SWIG w wyniku przetworzenia pliku interfejsowego sysinfo.i.Kiedy moduł sysinfo jest importowany, to faktycznie Python importuje sysinfo.py, a ten z kolei importuje sysinfoc (moduł rozszerzenia, który sam jest zawarty w sysinfo_wrap.c).Ponieważ sysinfo.py nie został umieszczony w ścieżce Pythona, trzeba znaleźć sposób, aby udostępnić go dla programu ebdemo.Najszybciej to zrobić kopiując sysinfo.py do bieżącego katalogu roboczego, przed rozpoczęciem programu ebdemo:$ cp./sysinfo/sysinfo.py.Typowo, plik sysinfo.py zostałby zainstalowany w ścieżce Pythona, ale dla uproszczenia używamy tu zwykłej metody kopiowania pliku:$./ebdemo>>> import sysinfo>>> si = sysinfo.sysinfo()>>> sysinfo.getsysinfo(si)>>> print si.totalram97861632>>>Tak więc, uruchomiony program ebdemo importuje moduł sysinfo.To importuje plik sysinfo.py, który z kolei importuje moduł sysinfoc.Jako, że moduł sysinfoc już był zainicjalizowany (poprzez wywołanie initsysinfoc w ebdemo.c), Python nie szukał współużytkowanego modułu rozszerzenia sysinfocmodule.so tak jak to czynił we wcześniej rozważanych przykładach z użyciem sysinfo.Z punktu widzenia Pythona, współużytkowany moduł rozszerzenia sysinfocmodule.so i statycznie skonsolidowany moduł sysinfoc mają dokładnie takie same działanie.Wbudowywanie Pythona przy użyciu wywołań niższego poziomuInterfejs programowania C API Pythona wysokiego poziomu ułatwia i przyspiesza wbudowywanie.Jednakże większość aplikacji macierzystych wymaga większej kontroli nad tym, w jaki sposób Python wykonuje skrypty [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • drakonia.opx.pl
  • Linki