Próbuję skonfigurować serwer z pythonem z terminala Mac.
Przechodzę do lokalizacji folderu i użyj:
python -m SimpleHTTPServer
Ale to daje mi błąd:
socket.error: [Errno 48] Address already in use
Wcześniej otworzyłem połączenie za pomocą tego samego polecenia dla innej witryny w innym miejscu na moim komputerze.
python -m SimpleHTTPServer 8081
Odpowiedzi:
Proces jest już powiązany z domyślnym portem (8000). Jeśli już wcześniej korzystałeś z tego samego modułu, najprawdopodobniej proces nadal jest powiązany z portem. Najpierw spróbuj zlokalizować inny proces:
Argumenty poleceń są uwzględnione, dzięki czemu można wykryć działający,
SimpleHTTPServer
jeślipython
aktywny jest więcej niż jeden proces. Możesz sprawdzić, czyhttp://localhost:8000/
nadal wyświetla listę katalogów dla plików lokalnych.Druga liczba to numer procesu; zatrzymaj serwer, wysyłając mu sygnał:
To wysyła standardowy
SIGTERM
sygnał; jeśli proces nie odpowiada, może być konieczne zastosowanie trudniejszych metod, takich jak wysyłanie sygnałuSIGKILL
(kill -s KILL <pid>
lubkill -9 <pid>
). Zobacz szczegóły w Wikipedii .Alternatywnie uruchom serwer na innym porcie, określając alternatywny port w wierszu poleceń:
następnie uzyskaj dostęp do serwera jako
http://localhost:8910
; gdzie8910
może być dowolna liczba od 1024 i więcej, pod warunkiem, że port nie jest już zajęty.źródło
sudo kill -9 PID
kill
wysyła sygnał do procesu, który może zdecydować się obsłużyć (np. zamknąć z wdziękiem lub obrócić plik dziennika). Sygnały te są liczbami całkowitymi (każdy z nazwą), domyślnie 15, co oznaczaTERM
lub kończy . Użycie -9 powoduje wysłanie sygnału 9,KILL
którego proces nie może złapać i zignorować, a system operacyjny zakończy proces, czy chce, czy nie.Proste rozwiązanie :
Znajdź proces za pomocą portu
8080
:sudo lsof -i:8080
Zabij to:
kill XXXX
źródło
lsof
mogłoby wyglądać wyjście i jak znaleźć identyfikator procesu („XXXX”, który wymieniasz) w danych wyjściowych. Dla każdego, kto widzi to bez tych informacji, jest to drugie pole na wyjściu, pod etykietą nagłówka „PID”.Posługiwać się
To da ci listę procesów korzystających z portu, jeśli taki istnieje. Po podaniu listy procesów użyj identyfikatora w kolumnie PID, aby zakończyć użycie procesu
źródło
Nawiasem mówiąc, aby temu zapobiec, po prostu naciśnij Ctrl+ Cw terminalu, gdy SimpleHTTPServer nadal działa normalnie. Spowoduje to „prawidłowe” zatrzymanie serwera i zwolnienie portu, dzięki czemu nie będziesz musiał ponownie znajdować i zabijać procesu przed ponownym uruchomieniem serwera.
(Mody: Próbowałem umieścić ten komentarz na najlepszej odpowiedzi tam, gdzie należy, ale nie mam wystarczającej reputacji.)
źródło
Proste polecenie w jednym wierszu, aby się go pozbyć, wpisz poniżej polecenie w terminalu,
Spowoduje to wyświetlenie całego procesu, pobranie, które jest używane przez Python i wpisz poniżej polecenie w terminalu,
Na przykład zabij -9 33178
źródło
Możesz także obsługiwać najwyższy dostępny port, robiąc coś takiego w Pythonie:
Jeśli musisz zrobić to samo dla innych narzędzi, może to być wygodniejsze jako skrypt bash:
Ustaw to jako plik wykonywalny z nazwą
get-free-port
i możesz zrobić coś takiego:Nie jest to tak niezawodne jak natywne podejście do Pythona, ponieważ skrypt bash nie przechwytuje portu - inny proces może pobrać port, zanim Twój proces to zrobi (warunek wyścigu) - ale nadal może być wystarczająco użyteczny, gdy używasz narzędzia, które nie „ mieć własne podejście typu „spróbuj ponownie”.
źródło
Jestem nowy w Pythonie, ale po moich krótkich badaniach dowiedziałem się, że jest to typowe dla oprawiania gniazd. Zdarza się, że gniazdo jest nadal używane i być może będziesz musiał poczekać, aby z niego skorzystać. Lub możesz po prostu dodać:
To powinno udostępnić port w krótszym czasie. W moim przypadku port był dostępny niemal natychmiast.
źródło
Na wypadek gdyby powyższe rozwiązania nie działały:
Uzyskaj port, którego nasłuchuje proces:
$ ps ax | pyton grep
Zabij proces
$ kill PROCESS_NAME
źródło
Mam Raspberry Pi i używam serwera WWW Python (za pomocą Flask). Próbowałem już wszystkiego powyżej, jedynym rozwiązaniem jest zamknięcie terminala (powłoki) i otwarcie go ponownie. Lub zrestartuj Raspberry Pi , ponieważ nic nie powstrzyma tego serwera ...
źródło
Możesz zezwolić serwerowi na ponowne użycie adresu
allow_reuse_address
.źródło