Poznajemy zintegrowane środowisko programistyczne dla Pythona. Piszemy polecenia w trybie interaktywnym.

Lekcja 1 - wprowadzenie Python to język programowania wysokiego poziomu, często używany jako język skryptowy. Cechuje go przejrzysta i zwięzła składnia. Jest językiem interpretowanym. Środowisko do programowania w Pythonie można pobrać ze strony Uruchom program IDLE (Python 3.6.5 64-bit). Pojawi się okno Powłoka Pythona, w którym możemy wypisywać polecenia do bezpośredniego wykonana. Polecenia wypisujemy po znaku zachęty >>>.

Wypróbuj w tym trybie następujące polecenia:

Śledź komunikaty interpretera i na tej podstawie staraj się zrozumieć działanie poleceń. Niektóre polecenia generują błędy. Zastanów się dlaczego.

Aby przejść do trybu skryptowego należy z menu wybrać File->New File. Po napisaniu programu trzeba go zapisać korzystając z File->Save As. Dopiero wtedy program można uruchomić poprzez Run->Run Module.

Utwórz na dysku h: folder Python. Będziesz w nim zapisywał wszystkie swoje programy w tym języku.

Napisz teraz swój pierwszy program.

W edytorze wpisz następujący tekst: print("Hello World!")

Zapisz go pod nazwą hello_world.py.

Uruchom napisany program. Możesz wykorzystać skrót klawiszowy F5.

Program możesz także uruchomić klikając dwukrotnie w plik hello_world.py na dysku h:. Niestety okienko programu natychmiast się zamknie. Aby to poprawić do programu dopisz jeszcze jedną linię:

input("Naciśnij Enter")

Debugowanie w trybie mieszanym dla języka Python - Visual Studio (Windows)

Spis treści

Wspólne debugowanie języków Python i C++

Artykuł

01/31/2022

Czas czytania: 5 min

Współautorzy: 2 Czy ta strona jest pomocna? Tak Nie Czy chcesz coś dodać do tej opinii? Opinia zostanie wysłana do firmy Microsoft: po naciśnięciu przycisku Prześlij opinia zostanie użyta do ulepszania produktów i usług firmy Microsoft. Zasady ochrony prywatności. Prześlij Dziękujemy.

W tym artykule

Większość zwykłych debugerów języka Python obsługuje debugowanie tylko kodu w języku Python. Jednak w praktyce język Python jest używany w połączeniu z C lub C++ w scenariuszach wymagających wysokiej wydajności lub możliwości bezpośredniego wywoływania interfejsów API platformy. (Aby uzyskać wskazówki, zobacz Tworzenie rozszerzenia C++ dla języka Python).

Visual Studio zintegrowane, jednoczesne debugowanie w trybie mieszanym dla języka Python i natywnego języka C/C++, pod warunkiem wybrania opcji Natywne narzędzia programskie języka Python dla obciążenia Programowanie w języku Python w instalatorze Visual Studio python.

Uwaga Debugowanie w trybie mieszanym nie jest dostępne w programie Python Tools for Visual Studio 1.x Visual Studio 2015 i starszych.

Funkcje debugowania w trybie mieszanym obejmują następujące elementy, jak wyjaśniono w tym artykule:

Połączone stosy wywołań

Krok między kodem python i kodem natywnym

Punkty przerwania w obu typach kodu

Zobacz reprezentacje obiektów w języku Python w ramkach natywnych i na odwrót

Debugowanie w kontekście projektu języka Python lub projektu języka C++

Aby uzyskać wprowadzenie do tworzenia, testowania i debugowania natywnych modułów języka C za pomocą Visual Studio, zobacz Szczegółowe informacje: tworzenie modułów natywnych 9 min 09. Film wideo dotyczy zarówno Visual Studio 2015, jak i 2017.

Włączanie debugowania w trybie mieszanym w projekcie języka Python

Kliknij prawym przyciskiem myszy projekt języka Python w Eksplorator rozwiązań, wybierz pozycję Właściwości, wybierz kartę Debugowanie , a następnie wybierz pozycję Włącz debugowanie kodu natywnego. Ta opcja włącza tryb mieszany dla wszystkich sesji debugowania. Porada Po włączeniu debugowania kodu natywnego okno danych wyjściowych języka Python może zniknąć natychmiast po zakończeniu działania programu bez nadawania zwykłego naciśnięcia dowolnego klawisza, aby kontynuować wstrzymanie . Aby wymusić wstrzymanie, dodaj -i opcję do pola Argumenty RunInterpreter > na karcie Debugowanie po włączeniu debugowania kodu natywnego. Ten argument umieszcza interpreter języka Python w tryb interaktywny po zakończeniu działania kodu, po czym czeka na naciśnięcie klawisza CtrlZEnter > + w celu zakończenia działania. Podczas dołączania debugera w trybie mieszanym do istniejącego procesu (DebugUłącz > do procesu) użyj przycisku Wybierz, aby otworzyć okno dialogowe Wybieranie typu kodu. Następnie ustaw opcję Debuguj te typy kodu i wybierz z listy zarówno kod natywny, jak i język Python: Ustawienia typu kodu są trwałe, więc jeśli chcesz wyłączyć debugowanie w trybie mieszanym podczas dołączania do innego procesu później, wyczyść typ kodu w języku Python . Istnieje możliwość wybrania innych typów kodu oprócz lub zamiast typu Natywna. Jeśli na przykład aplikacja zarządzana hostuje środowisko CPython, które z kolei korzysta z natywnych modułów rozszerzeń i chcesz debugować wszystkie trzy, możesz sprawdzić język Python**, natywny** i zarządzany razem, aby uzyskać ujednolicone środowisko debugowania, w tym połączone stosy wywołań i wykonywanie krokowe między wszystkimi trzema środowiskami uruchomieniowym. Po pierwszym uruchomieniu debugowania w trybie mieszanym może zostać wyświetlone okno dialogowe Wymagane symbole języka Python (zobacz Symbole debugowania w trybie mieszanym). Symbole należy instalować tylko raz dla dowolnego środowiska języka Python. Symbole są automatycznie uwzględniane w przypadku instalowania obsługi języka Python za pośrednictwem Visual Studio programu (Visual Studio 2017 i nowszych). Aby udostępnić kod źródłowy standardowego języka Python podczas debugowania, stronę , pobierz archiwum odpowiednie dla Twojej wersji i wyodrębnij go do folderu. Następnie możesz wskazać Visual Studio określonych plików w tym folderze niezależnie od tego, kiedy zostanie wyświetlony monit.

Włączanie debugowania w trybie mieszanym w projekcie C/C++

Visual Studio (wersja 2017 15.5 lub nowsza) obsługuje debugowanie w trybie mieszanym z projektu C/C++ (na przykład podczas osadzania języka Python w innej aplikacji zgodnie z opisem w Aby włączyć debugowanie w trybie mieszanym, skonfiguruj projekt C/C++ tak, aby uruchamiał język Python/debugowanie natywne:

Kliknij prawym przyciskiem myszy projekt C/C++ w Eksplorator rozwiązań wybierz pozycję Właściwości. Wybierz kartę Debugowanie , wybierz pozycję Python/Debugowanie natywne z debugera do uruchomienia, a następnie wybierz przycisk OK.

Uwaga Jeśli nie masz możliwości wybrania opcji Debugowanie języka Python/ natywnego, musisz najpierw zainstalować natywne narzędzia programowe języka Python przy użyciu instalatora programu VS. Możesz go znaleźć jako opcję w obciążeniu Programowanie w języku Python. Aby uzyskać dodatkowe informacje, zobacz Jak zainstalować obsługę języka Python w Visual Studio na Windows.

Korzystając z tej metody, należy pamiętać, że nie można debugować ** ponieważ spowoduje to zduplikowanie podrzędnego do który debuger nie zostanie dołączony. Jeśli chcesz uruchomić z argumentami, zmień opcję Command (Polecenie) we właściwościach Python/Native Debugging (Debugowanie natywne) (pokazanej na poprzedniej ilustracji), aby określić pełną ścieżkę a następnie określ argumenty w argumentach polecenia.**

Dołączanie debugera w trybie mieszanym

We wszystkich poprzednich wersjach programu Visual Studio debugowanie w trybie mieszanym jest włączone tylko podczas uruchamiania projektu języka Python w programie Visual Studio, ponieważ projekty C/C++ używają tylko natywnego debugera. Można jednak dołączyć debuger oddzielnie:

Uruchom projekt języka C++ bez debugowania (DebugujStart > bez debugowania lub CtrlF5+). Wybierz pozycję DebugujZałącz > do procesu. W wyświetlonym oknie dialogowym wybierz odpowiedni proces, a następnie użyj przycisku Wybierz, aby otworzyć okno dialogowe Wybieranie typu kodu, w którym można wybrać język Python: Wybierz przycisk OK , aby zamknąć to okno dialogowe, a następnie pozycję Dołącz , aby uruchomić debuger. Może być konieczne wprowadzenie odpowiedniego wstrzymania lub opóźnienia w aplikacji C++, aby upewnić się, że nie wywoła ona kodu języka Python, który chcesz debugować, zanim będzie można dołączyć debuger.

Funkcje specyficzne dla trybu mieszanego

Połączony stos wywołań

Okno Stos wywołań pokazuje przeplatane ramki stosu natywnego i python z przejściami oznaczonymi między nimi:

Przejścia są wyświetlane jako [Kod zewnętrzny], bez określania kierunku przejścia, jeśli opcja NarzędziaOpcjeDebuggingGeneralEnable > > > > Tylko mój kod jest ustawiona.

Dwukrotne kliknięcie dowolnej ramki wywołania powoduje jej aktywna i otwiera odpowiedni kod źródłowy, jeśli jest to możliwe. Jeśli kod źródłowy nie jest dostępny, ramka jest nadal aktywna i można sprawdzić zmienne lokalne.

Krok między kodem python i kodem natywnym

W przypadku korzystania z poleceń Step Into (F11) lub Step Out (ShiftF11+) debuger trybu mieszanego poprawnie obsługuje zmiany między typami kodu. Na przykład gdy język Python wywołuje metodę typu zaimplementowaną w języku C, wykonywanie krokowe wywołania tej metody zatrzymuje się na początku funkcji natywnej implementujące metodę. Podobnie, gdy kod natywny wywołuje funkcję interfejsu API języka Python, co powoduje wywołanie kodu w języku Python. Na przykład przechodzenie do wartości PyObject_CallObject funkcji, która została pierwotnie zdefiniowana w języku Python, zatrzymuje się na początku funkcji języka Python. Przechodzenie z języka Python do natywnego jest również obsługiwane w przypadku funkcji natywnych wywoływanych z języka Python za pośrednictwem typów ctype.

Widok wartości PyObject w kodzie natywnym

Gdy aktywna jest ramka natywna (C lub C++), jej zmienne lokalne są wyświetlane w oknie zmiennych lokalnych debugera. W natywnych modułach PyObject rozszerzeń języka Python wiele z tych zmiennych jest typu (czyli typedef dla _object ) lub kilku innych podstawowych typów języka Python (zobacz listę poniżej). W przypadku debugowania w trybie mieszanym te wartości prezentują dodatkowy węzeł podrzędny z etykietą [widok języka Python]. Po rozwinięciu ten węzeł pokazuje reprezentację zmiennej w języku Python, identyczną z tym, co można zobaczyć, jeśli zmienna lokalna odwołująca się do tego samego obiektu była obecna w ramce języka Python. Dzieci tego węzła można edytować.

Aby wyłączyć tę funkcję, kliknij prawym przyciskiem myszy w dowolnym miejscu okna Ustawienia lokalne i przełącz opcję menu PythonShow > Python View Nodes (Węzły widoku języka Python):

Typy języka C, które pokazują węzły [widok języka Python] (jeśli są włączone):

PyObject

PyVarObject

PyTypeObject

PyByteArrayObject

PyBytesObject

PyTupleObject

PyListObject

PyDictObject

PySetObject

PyIntObject

PyLongObject

PyFloatObject

PyStringObject

PyUnicodeObject

[Widok języka Python] nie jest automatycznie wyświetlany dla typów, które tworzysz samodzielnie. Podczas tworzenia rozszerzeń dla języka Python 3.x ten brak zazwyczaj nie stanowi problemu, ob_base ponieważ każdy obiekt ostatecznie ma pole jednego z powyższych typów, co powoduje wyświetlenie [widoku języka Python ].

Jednak w przypadku języka Python 2.x każdy typ obiektu zwykle deklaruje swój nagłówek jako kolekcję pól w tekście i PyObject nie istnieje skojarzenie między typami niestandardowymi i na poziomie systemu typów w kodzie C/C++. Aby włączyć węzły [widok języka Python] dla takich typów niestandardowych, edytuj plik w katalogu instalacji narzędzi języka Python i dodaj kolejny element w pliku XML dla struktury C lub klasy C++. Alternatywną (i lepszą) opcją jest zastosowanie pepy 3123 PyObject ob_base; PyObject_HEAD i użycie jawnego pola zamiast , chociaż nie zawsze może to być możliwe ze względu na zgodność z poprzednimi wersjami.

Widok wartości natywnych w kodzie języka Python

Podobnie jak w poprzedniej sekcji, możesz włączyć widok [C++] dla wartości natywnych w oknie Środowiska lokalne, gdy ramka języka Python jest aktywna. Ta funkcja nie jest domyślnie włączona, więc można ją włączyć, klikając prawym przyciskiem myszy w oknie Ustawienia lokalne i przełączanie opcji menu Węzły widoku języka C++ dla języka Python. >

Węzeł [Widok C++] zapewnia reprezentację podstawowej struktury C/C++ dla wartości, identyczną z tym, co można zobaczyć w ramce natywnej. Na przykład _longobject pokazuje wystąpienie obiektu ( PyLongObject dla którego jest typedef) dla długiej liczby całkowitej języka Python i próbuje wywnioskować typy dla klas natywnych, które zostały przez Ciebie skonstygowane. Dzieci tego węzła można edytować.

PyObject Jeśli pole podrzędne obiektu jest typu lub jeden z innych obsługiwanych typów, ma węzeł reprezentacji [Widok języka Python] (jeśli te reprezentacje są włączone), co umożliwia nawigowanie po wykresach obiektów, w których linki nie są bezpośrednio widoczne dla języka Python.

W przeciwieństwie do węzłów [Widok języka Python], które używają metadanych obiektu języka Python do określania typu obiektu, nie ma podobnego niezawodnego mechanizmu dla widoku [C++]. Ogólnie rzecz biorąc, biorąc pod uwagę wartość języka Python ( PyObject to jest odwołanie), nie można niezawodnie określić, która struktura C/C++ ją wspiera. Debuger trybu mieszanego próbuje odgadnąć ten typ, patrząc na różne pola typu obiektu ( PyTypeObject ob_type na przykład przywołyne przez jego pole), które mają typy wskaźników funkcji. Jeśli jeden z tych wskaźników funkcji odwołuje się do funkcji, która może zostać rozpoznana, a self PyObject* ta funkcja ma parametr o typie bardziej określonym niż , przyjmuje się, że ten typ jest typem zapasowym. Jeśli na przykład ob_type->tp_init dany obiekt wskazuje następującą funkcję:

static int FobObject_init(FobObject* self, PyObject* args, PyObject* kwds) { return 0; }

następnie debuger może prawidłowo wydeduować, że typ C obiektu to FobObject . Jeśli nie można określić bardziej precyzyjnego typu z tp_init , zostanie on przeniesiony do innych pól. Jeśli nie można wydeduować typu z żadnego z tych pól, węzeł [widok C++] przedstawia obiekt jako wystąpienie PyObject .

Aby zawsze uzyskać przydatną reprezentację dla niestandardowych typów niestandardowych, self najlepiej zarejestrować co najmniej jedną funkcję specjalną podczas rejestrowania typu i użyć silnie typimetru parametru. Większość typów spełnia to wymaganie w naturalny sposób. Jeśli tak nie jest, jest tp_init to zazwyczaj najbardziej wygodny wpis do użycia w tym celu. Fikcyjna implementacja tp_init dla typu, który jest obecny wyłącznie w celu włączenia wnioskowania typu debugera, może po prostu natychmiast zwrócić zero, jak w powyższym przykładzie kodu.

Różnice w standardowych debugowaniu języka Python

Debuger w trybie mieszanym różni się od standardowego debugera języka Python tym, że wprowadza pewne dodatkowe funkcje, ale nie ma niektórych możliwości związanych z pythonem:

Nieobsługiwane funkcje: warunkowe punkty przerwania, okno Debugowanie interakcyjne i zdalne debugowanie międzyplatformowe.

i zdalne debugowanie międzyplatformowe. Okno natychmiastowe: jest dostępne, ale z ograniczonym podzbiorem funkcji, w tym ze wszystkimi ograniczeniami wymienionymi tutaj.

natychmiastowe: jest dostępne, ale z ograniczonym podzbiorem funkcji, w tym ze wszystkimi ograniczeniami wymienionymi tutaj. Obsługiwane wersje języka Python: tylko CPython 2.7 i 3.3+.

Visual Studio Shell: w przypadku korzystania z języka Python z programem Visual Studio Shell (na przykład jeśli zainstalowano go przy użyciu zintegrowanego instalatora), program Visual Studio nie może otwierać projektów języka C++, a środowisko edytowania plików języka C++ jest dostępne tylko w podstawowym edytorze tekstów. Jednak debugowanie C/C++ i debugowanie w trybie mieszanym są w pełni obsługiwane w programie Shell z kodem źródłowym, przechodzeniem do kodu natywnego i oceną wyrażeń C++ w oknach debugera.

Wyświetlanie i rozwijanie obiektów: podczas wyświetlania obiektów języka Python w oknach debugera Locals i Watch debuger (Tryb mieszany) pokazuje tylko strukturę obiektów. Nie ocenia automatycznie właściwości ani nie wyświetla obliczanych atrybutów. W przypadku kolekcji pokazuje tylko elementy dla wbudowanych typów kolekcji ( tuple , list , dict , set ). Niestandardowe typy kolekcji nie są wizualizowane jako kolekcje, chyba że są dziedziczone z niektórych wbudowanych typów kolekcji.

i debuger (Tryb mieszany) pokazuje tylko strukturę obiektów. Nie ocenia automatycznie właściwości ani nie wyświetla obliczanych atrybutów. W przypadku kolekcji pokazuje tylko elementy dla wbudowanych typów kolekcji ( , , , ). Niestandardowe typy kolekcji nie są wizualizowane jako kolekcje, chyba że są dziedziczone z niektórych wbudowanych typów kolekcji. Ocena wyrażeń: zobacz poniżej.

Ocena wyrażeń

Standardowy debuger języka Python umożliwia ocenę dowolnych wyrażeń języka Python w oknach Czujka i Natychmiastowe, gdy debugowany proces jest wstrzymany w dowolnym punkcie kodu, o ile nie jest blokowany w operacji We/Wy lub innym podobnym wywołaniu systemowym. W przypadku debugowania w trybie mieszanym dowolne wyrażenia mogą być oceniane tylko wtedy, gdy zostaną zatrzymane w kodzie języka Python, po punkcie przerwania lub podczas przechodzenia do kodu. Wyrażenia mogą być oceniane tylko w wątku, w którym wystąpił punkt przerwania lub operacja krokowa.

Po zatrzymaniu w kodzie natywnym lub w kodzie języka Python, w którym powyższe warunki nie mają zastosowania (na przykład po operacji wyetapiania lub w innym wątku), ocena wyrażeń jest ograniczona do uzyskiwania dostępu do zmiennych lokalnych i globalnych w zakresie aktualnie wybranej ramki, uzyskiwania dostępu do ich pól i indeksowania wbudowanych typów kolekcji za pomocą literałów. Na przykład następujące wyrażenie może być oceniane w dowolnym kontekście (pod warunkiem, że wszystkie identyfikatory odwołują się do istniejących zmiennych i pól odpowiednich typów):

foo.bar[0].baz['key']

Debuger trybu mieszanego również inaczej rozwiązują te wyrażenia. Wszystkie operacje dostępu do składowych przeszukują tylko pola, które są bezpośrednio częścią obiektu ( __dict__ na przykład wpis w jego obiekcie lub __slots__ w polu struktury natywnej, która jest dostępna dla języka Python za pośrednictwem języka ) tp_members``__getattr__ i ignorują dowolną logikę deskryptora __getattribute__ lub . Podobnie wszystkie operacje indeksowania ignorują i __getitem__ bezpośrednio uzyskają dostęp do wewnętrznych struktur danych kolekcji.

W celu zachowania spójności ten schemat rozpoznawania nazw jest używany dla wszystkich wyrażeń, które pasują do ograniczeń w przypadku ograniczonej oceny wyrażeń, niezależnie od tego, czy dowolne wyrażenia są dozwolone w bieżącym punkcie zatrzymania. Aby wymusić odpowiednią semantykę języka Python, gdy jest dostępny w pełni funkcjonalny ewaluator, należy ująć wyrażenie w nawiasy:

Bezpieczeństwo sieci w Pythonie Rozwiązywanie problemów za pomocą skryptów i bibliotek

Bezpieczeństwo sieci w Pythonie Rozwiązywanie problemów za pomocą skryptów i bibliotek

Popularność Pythona wynika z jego wszechstronności, prostoty, a także ze zwięzłości i z łatwości pisania kodu. Rozbudowywana z każdą aktualizacją kolekcja narzędzi i bibliotek pozwala na używanie Pythona do coraz bardziej specjalistycznych zadań, takich jak zabezpieczanie sieci. O tym, że skuteczna ochrona sieci ma krytyczne znaczenie dla organizacji, świadczą powtarzające się przypadki cyberataków i utraty cennych danych. Warto więc wykorzystać możliwości Pythona do wykrywania zagrożeń i rozwiązywania różnych problemów związanych z siecią.

Tę książkę docenią specjaliści do spraw bezpieczeństwa i inżynierowie sieci. Dzięki niej zapoznasz się z najnowszymi pakietami i bibliotekami Pythona i nauczysz się pisać skrypty, które pozwolą Ci zabezpieczyć sieć na wielu poziomach. Dowiesz się, w jaki sposób przesyłać dane i korzystać z sieci Tor. Nauczysz się też identyfikować podatności systemu na ataki, aby tym skuteczniej zapewnić mu bezpieczeństwo. W naturalny sposób przyswoisz wiedzę, która pozwoli Ci tworzyć w Pythonie bezpieczne aplikacje, zaczniesz również stosować techniki kryptograficzne i steganograficzne. Znajdziesz tu także wskazówki, jak rozwiązywać różne problemy sieciowe, pisać skrypty do wykrywania zagrożeń sieci i stron internetowych, zabezpieczać urządzenia końcowe, pozyskiwać metadane i pisać skrypty kryptograficzne.

Najważniejsze zagadnienia:

skrypty automatyzujące procedury bezpieczeństwa i testy penetracyjne

narzędzia programistyczne służące do zabezpieczania sieci

automatyczna analiza serwerów

wykrywanie podatności na ataki i analiza bezpieczeństwa

praca z siecią Tor

stosowanie narzędzi do analizy śledczej

Python w sieci: najlepsza ochrona!

O autorze

Jose Manuel Ortega Candel jest inżynierem oprogramowania i analitykiem bezpieczeństwa. Specjalizuje się w nowych technologiach i testowaniu otwartego oprogramowania. Współpracował z uczelniami informatycznymi, publikował artykuły i organizował konferencje. Był także prelegentem na różnych krajowych i międzynarodowych spotkaniach.

Jarosław Kułak
Jarosław Kułak

Leave a Comment