2016-08-03 54 views
0

好了在一個開放套接字終止進程我打開一個套接字連接到本地端口和啓動過程的程序,代碼去如下:從另一個類

socket_opener.py

processes=[] 
Handler = CGIHTTPServer.CGIHTTPRequestHandler 
Handler.cgi_directories = ["/maps"] 
httpd = SocketServer.TCPServer(("", PORT), Handler) 
httpd.server_name = "localhost" 
httpd.server_port = 8008 
processes.append(subprocess.Popen("ls")) 
processes.append(subprocess.Popen("ls")) 
httpd.serve_forever() 

現在我要殺死從進程上面如此宣佈的名單processes游泳池的過程中,我嘗試了以下內容:

process_killer.py

from socket_opener import processes 

可悲的是這是據我可以去,因爲它拋出這個錯誤

socket.error: [Errno 98] Address already in use 

我能做到這一點有什麼其他辦法嗎?

回答

1

這裏最接近的原因是您通過導入模塊再次運行socket_opener中的所有代碼。這失敗了,因爲已經有一個套接字綁定到編號爲PORT的端口,並且您試圖綁定另一個套接字。

(據我所知,您要添加server_name和屬性的對象你已經創造了它之後,將會對公司經營沒有影響。你真的應該提供完整的可覈查的例子(mcve)。 )

但是更大的問題是,您似乎在假設您可以在一個程序中定義列表(socket_opener),然後從另一個程序(process_killer)訪問該列表。它不會這樣工作:第一個程序將在它自己的進程地址空間中運行,與第二個程序分開。第二個程序將無法訪問第一個變量。

您需要將進程列表放置在可從不同程序(文件,共享內存段或某種其他IPC [進程間通信]機制)訪問的某個外部對象中。列表的形式必須是一個不同的程序可以使用的東西:一個進程ID的文本列表,比方說,而不是python list包含python Popen對象的對象,這些對象都不會在原始程序的地址之外有意義空間。

+0

謝謝你在答案上的努力,你是對的,物體被綁定到端口使它無法訪問。我最終將pid保存在數據庫中,並在需要時刪除它。 –