Nie odpala się skrypt w Pythonie


(XOR) #1

Witam. Ściągnąłem niedawno potrzebny mi skrypt pythona z rozszerzeniem .py. Wymagał importu bibliotek co też zrobiłem. Jednak, gdy wywołuję skrypt zamiast jakiegokolwiek efektu wywala mi tylko napis ======RESTART=====

Co to oznacza?


(Frankfurterium) #2

Zajrzyj do skryptu i sprawdź.


(Krystian Rosinski) #3

To oznacza, że zamiast uruchomić skrypt wybierasz w IDLE "Restart Shell". Proponuję wcisnąć F5. Podaj więcej szczegółów i jeśli to możliwe kod skryptu.


(XOR) #4

Oto ten skrypt. Nazywa się gates.py. Poniżej link:

http://pyquantum.googlecode.com/hg/

Wiem, że nie ma w nim komendy wywołania, ale wydaje się, że w jakiś sposób musi on działać. Po co robić zapis programów w skrypcie py? Rownie dobrze można byłoby to napisać w notatniku :slight_smile: Skrypt ma teoretycznie symulować działanie bramek logicznych.


(Frankfurterium) #5

Python jest językiem interpretowanym. To znaczy, że interpreter wczytuje polecenia zapisane gołym tekstem (rodem z Notatnika, jak zauważyłeś) i w locie je wykonuje.

Skrypt, z tego co wyczytałem, nie jest samodzielnym programem, a biblioteką. Oznacza to, że nie uruchamiasz go, a załączasz go do własnego projektu i korzystasz z jego klas i/lub metod.


(XOR) #6

Tak coś właśnie czułem. Jestem zielony w Python, przeszedłem 3 tutoriale. Skoro już potwierdzone, że to biblioteka, to czy mogę napisać prosty skrypt, który odwoła się to zawartych w gates.py bramek i je wykona wyrzucając na ekran efekt? Chodzi mi o bezpośrednie wykonanie. Rozumiem, że w moim programie musiałbym zrobić:

import gates

Nie wiem tylko jak się odwołać do funkcji tego skryptu-biblioteki.


(Krystian Rosinski) #7

Pliki Pythona tradycyjnie oznacza się przy pomocy rozszerzenia .py. Umownie mówimy o skryptach lub modułach (w zależności od zastosowania; importujemy moduły, uruchamiamy skrypty). Wskazany plik gates.py korzysta z dodatkowych pakietów i modułów: wbudowanego decimal, zewnętrznego numpy (należy doinstalować) oraz z modułu complexdecimal.py będącego częścią tego projektu.

Pliki te należy umieścić w ścieżce PATH, aby były widoczne dla Pythona. Najprościej zapisać je w tym samym folderze. Aby móc korzystać z pakietu (czyli zestawu modułów zapisanych w folderze) pyquantum należy napisać program/skrypt, opcjonalnie uruchomić wiersz poleceń / konsolę, przejść do utworzonego folderu, uruchomić Pythona i zaimportować moduł korzystając z sesji interaktywnej. Jeśli nie lubisz wiersza poleceń Windows, możesz kliknąć na ikonę skrótu do IDLE i we właściwościach ustawić ścieżkę "Rozpocznij w..." na tym folderze.

Podsumowując: Zapisz te trzy pliki w folderze. Następnie napisz program, który będzie korzystał z tych gotowych modułów, np.

# coding: utf-8

"""

Program wykona wszystkie instrukcje z góry do dołu, od lewej do prawej.

"""

import gates


print(gates.T)

lub

# coding: utf-8


import gates


if __name__ == ' __main__': # z tego miejsca program wystartuje

    print(gates.T)

Koniecznie poczytaj o uruchamianiu programów Pythona, ścieżce PATH, importowaniu modułów.


(XOR) #8

Dzięki. Jako tako działa i część bramek logicznych wyświetla się. Wygląda jednak na to, że mimo, iż w pliku gates.py jest instrukcja import complexdecimal to skrypt nie rozpoznaje poleceń ComplexDecimal(Decimal.sqrt....

Np. w prypadku H na ekran wywala

[

]

[

]]

Z definicji wiem, że w przypadku bramki/funkcji H powinny być tam pierwiastki kwadratowe :slight_smile: Numpy już kiedyś doinstalowałem.

Przy okazji dwa pytania co do Pythona.

  1. Czy biblioteki muszę importować za każdym razem w skrypcie - np. w każdym pliku korzystającym z numpy muszę dopisywać import numpy, czy wystarczy dokonać tego raz w IDLE

  2. Jak w Python command line lub IDLE dodać path. Jaka jest komenda w command line na przejście na odpowiednią partycję? Gdy wpisuję C:... wywala mi, że invalid syntax.


(Krystian Rosinski) #9

Rozpoznaje. Wyświetla rezultat na ekranie. Jest nim macierz (matrix z modułu numpy) instancji klasy ComplexDecimal z modułu complexdecimal. Macierz NumPy można traktować w uproszczeniu jako listę list, które można indeksować. Jeśli chcesz wyświetlić konkretną wartość liczby ComplexDecimal użyj funkcji print(). Aby dokładnie zrozumieć dlaczego tak, należy wkroczyć na wyższy poziom magii, czyli do funkcji specjalnych odpowiedzialnych za przeciążanie operatorów. Są to funkcje, które zaczynają i kończą się znakami __. Jedną z nich jest funkcja __str__. Odpowiada ona za rezultat wyświetlany przy pomocy funkcji print(). Jeśli zerkniesz do modułu complexdecimal.py to znajdziesz tam klasę ComplexDecimal, w której zaimplementowano kilka metod specjalnych, w celu zdefiniowania nowej liczby zespolonej opartej na typie Decimal. Zaimplementowano również ponownie metodę __str__.

W powyższym przypadku oczekiwany wynik powinno dać: print(gates.H[0][0])

Gdzie [0][0] oznacza pierwszy element pierwszego wiersza (indeksowanie tradycyjnie rozpoczynamy od zera).

Wracając do print i __str__... Weźmy bardzo uproszczony przykład wpisany w sesji interaktywnej:

>>> class MyComplexNumber(object):

	def __init__ (self, real, imag):

		self.real = real

		self.imag = imag



>>> my_complex_number = MyComplexNumber(3, 4)

>>> my_complex_number

< __main__.MyComplexNumber object at 0x02E464D0>

>>> print(my_complex_number)

< __main__.MyComplexNumber object at 0x02E464D0>

Otrzymujemy podobny rezultat do tego, który otrzymałeś. Następnie dodajmy do klasy metodę __str__, która będzie określała w jaki sposób funkcja print ma wyświetlać rezultat:

>>> class MyComplexNumber(object):

	def __init__ (self, real, imag):

		self.real = real

		self.imag = imag

	def __str__ (self):

		return str(self.real) + " + " + str(self.imag) + "j"



>>> my_complex_number = MyComplexNumber(3, 4)

>>> my_complex_number

< __main__.MyComplexNumber object at 0x02E46510>

>>> print(my_complex_number)

3 + 4j

Jak widać, działa zgodnie z oczekiwaniami.

W każdym module należy wyraźnie zaznaczyć z czego korzystamy. Zgodnie z zasadami "Zen". Wpisz w IDLE "import this". Druga zasada mówi "Explicit is better than implicit." W IDLE nic nie musisz wpisywać. IDLE nie jest potrzebne do uruchamiania programów napisanych w Pythonie. Wystarczy kliknąć na ikonę lub uruchomić z program z konsoli, np.

C:\Users\User\Desktop>myapp.py

W przypadku Pythona 3.3 zadziała również:

C:\Users\User\Desktop>py myapp.py

W przypadku dowolnej wersji Pythona o ile masz poprawnie ustawioną ścieżkę Path w systemie:

C:\Users\User\Desktop>python myapp.py

To pytanie dotyczy już obsługi systemu operacyjnego, a nie Pythona. Najpierw uruchamiasz wiersz poleceń (Start -> Wyszukaj -> cmd), przechodzisz do folderu z plikiem głównym programu (zmiana partycji na C to C:) i podajesz nazwę skryptu, np. main.py.

Odpowiedź na to pytanie znajdziesz również http://docs.python.org/3.3/using/windows.html#excursus-setting-environment-variables. Poza tym Google pokazuje na obrazkach jak się ustawia zmienne środowiskowe w Windowsie. Ale wystarczy zapamiętać, że aby uruchomić program należy (jak w przypadku innych programów):

  • Kliknąć ikonę programu (UWAGA: Jeśli program wyświetla tylko rezultat przy pomocy print i nic poza tym to zaledwie mignie okno konsoli na ekranie, a nawet może być całkowicie niewidoczne)

  • Uruchomić wiersz poleceń i podać nazwę programu (stosować w przypadku programów konsolowych)