Địa chỉ Python [Errno 98] đã được sử dụng


91

Trong chương trình ổ cắm Python của tôi, đôi khi tôi cần phải ngắt nó bằng Ctrl-C. Khi tôi làm điều này, nó sẽ đóng kết nối bằng cách sử dụng socket.close().

Tuy nhiên, khi tôi cố gắng mở lại nó, tôi phải đợi khoảng một phút trước khi có thể kết nối lại. Làm thế nào để đóng một ổ cắm một cách chính xác? Hay đây là dự định?

Câu trả lời:


114

Có, nó được dự định. Ở đây bạn có thể đọc giải thích chi tiết . Có thể ghi đè hành vi này bằng cách đặt tùy chọn SO_REUSEADDR trên ổ cắm. Ví dụ:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Thật kỳ lạ. Tôi đã gọi điều này ngay trước khi ràng buộc và lỗi vẫn đang xảy ra. Tôi phải làm sai ở một nơi khác.
byxor

Đừng bận tâm, tôi đã gặp phải tình trạng chạy đua kỳ lạ khi liên tục ràng buộc và tắt các chuỗi riêng biệt cho các bài kiểm tra tự động của mình.
byxor

Bạn cần nhập mô-đun được gọi là socket.
Bartosz

30
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211

1
Thật không may, nó không phải lúc nào cũng hoạt động. Đây là suy nghĩ ngay lập tức của tôi khi tôi gặp phải vấn đề này, nhưng không có quy trình giết trăn nào trong trường hợp của tôi.
Kryten

19

Nếu bạn sử dụng TCPServer, UDPServer hoặc các lớp con của chúng trong mô-đun SocketServer, bạn có thể đặt biến lớp này (trước khi cài đặt máy chủ):

SocketServer.TCPServer.allow_reuse_address = True

(qua SocketServer.ThreadingTCPServer - Không thể liên kết với địa chỉ sau khi khởi động lại chương trình )

Điều này khiến init (hàm tạo):

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

12

vì bạn đang cố gắng chạy dịch vụ trong cùng một cổng đang chạy.

đôi khi nó xảy ra vì dịch vụ của bạn không bị dừng trong ngăn xếp quy trình. bạn phải giết chúng

không cần cài đặt bất cứ thứ gì ở đây là lệnh một dòng để giết tất cả các quy trình python đang chạy.

cho hệ điều hành dựa trên Linux:

Bash:

kill -9 $(ps -A | grep python | awk '{print $1}')

Cá:

kill -9 (ps -A | grep python | awk '{print $1}')

1
Làm việc cho tôi Cảm ơn!

1
Làm việc cho tôi Cảm ơn
user007

6

Không có gì hiệu quả với tôi ngoại trừ chạy một quy trình con với lệnh này, trước khi gọi HTTPServer(('', 443), myHandler):

kill -9 $(lsof -ti tcp:443)

Tất nhiên điều này chỉ dành cho hệ điều hành giống linux!


5

Một giải pháp đơn giản phù hợp với tôi là đóng Terminal và khởi động lại nó.


3

Trước hết, hãy tìm ID quy trình python bằng lệnh này

ps -fA | grep python

Bạn sẽ nhận được một số pid bằng cách đặt tên cho quá trình python của bạn trên cột thứ hai

Sau đó, giết quá trình bằng lệnh này

kill -9 pid

0

Gặp lỗi tương tự:
Các bước sau:
1 - đã sử dụng $ ps -fA | grep python
2 - Đã giết tất cả quy trình
3 - Đóng thiết bị đầu cuối
4 - chạy lại và khởi chạy ứng dụng (mkchromecast).
5 - không nhận được thông báo lỗi này.

Có một vấn đề khác. theo dõi điều đó.


0

chạy lệnh

fuser -k (port_number_you_are _trying_to_access)/TCP

ví dụ cho bình: fuser -k 5000/tcp

Ngoài ra, hãy nhớ lỗi này phát sinh khi bạn nhập bằng ctrl + z. vì vậy để chấm dứt sử dụng ctrl + c

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.