Chciałbym wiedzieć, jak wyjść z Pythona bez zrzutu zrzutu danych wyjściowych.
Nadal chcę, aby móc zwrócić kod błędu, ale nie chcę wyświetlać dziennika śledzenia.
Chcę móc wyjść exit(number)
bez śledzenia, ale w przypadku wyjątku (nie wyjścia) chcę śledzenia.
Odpowiedzi:
Prawdopodobnie napotykasz wyjątek, a program wychodzi z tego powodu (z funkcją śledzenia). Pierwszą rzeczą, którą należy zrobić, to złapać ten wyjątek, zanim wyjdzie on czysto (może z komunikatem, podanym przykładem).
Wypróbuj coś takiego w swojej
main
rutynie:źródło
except Exception:
dosys.exit(0)
włącznie. Jest to już domyślne zachowanie, aby wydrukować śledzenie wszystkich nieobsługiwanych wyjątków i wyjść po zakończeniu kodu, więc po co męczyć się z tym samym ręcznie?sys.exit()
należy stosować w przypadku programów.exit()
jest przeznaczony do interaktywnych powłok. Zobacz Różnica między exit () a sys.exit () w Pythonie? .Być może próbujesz uchwycić wszystkie wyjątki, a to łapie
SystemExit
wyjątek zgłoszony przezsys.exit()
?Ogólnie rzecz biorąc, używanie
except:
bez nazewnictwa wyjątków jest złym pomysłem. Złapiesz wszystkie rzeczy, których nie chcesz - na przykładSystemExit
- i może również maskować własne błędy programistyczne. Mój przykład powyżej jest głupi, chyba że robisz coś w zakresie czyszczenia. Możesz go zastąpić:Jeśli musisz wyjść bez podnoszenia
SystemExit
:Robię to w kodzie, który działa w trybie unittest i wywołuje
fork()
. Unittest dostaje się, gdy rozwidla się procesSystemExit
. To zdecydowanie przypadek narożny!źródło
SystemExit
po co łapać, żeby zadzwonićsys.exit(e)
? Usunięcie obu linii ma ten sam efekt. Ponadto, należy do czyszczeniafinally:
, nieexcept Exception: ... raise
.źródło
coś jak
import sys; sys.exit(0)
?źródło
Poniższy kod nie zgłosi wyjątku i zakończy działanie bez śledzenia:
Zobacz to pytanie i powiązane odpowiedzi, aby uzyskać więcej informacji. Zaskoczony, dlaczego wszystkie inne odpowiedzi są tak skomplikowane.
źródło
O wiele lepszą praktyką jest unikanie używania sys.exit () i zamiast tego podnoszenie / obsługa wyjątków, aby umożliwić programowi dokładne zakończenie. Jeśli chcesz wyłączyć śledzenie, po prostu użyj:
Możesz ustawić to u góry skryptu, aby zmiażdżyć wszystkie dane wyjściowe śledzenia, ale wolę używać go bardziej oszczędnie, na przykład „znane błędy”, w których chcę, aby dane wyjściowe były czyste, np. W pliku foo.py:
Jeśli zostanie złapany CalledProcessError, dane wyjściowe będą wyglądać następująco:
Jeśli wystąpi jakikolwiek inny błąd, nadal otrzymujemy pełne dane wyjściowe śledzenia.
źródło
sys.trackbacklimit
z Python 3, zobacz tę odpowiedź .Użyj wbudowanej funkcji pyton quit () i to wszystko. Nie trzeba importować żadnej biblioteki. Używam Pythona 3.4
źródło
Zrobiłbym to w ten sposób:
źródło
Co powiesz na
Bez śledzenia i jakoś bardziej jednoznacznie.
źródło
źródło