Python程序运行完后不自动退出,为什么?

xhp168168 2016-12-06 07:19:34

在Windows系统上(机器A,作为客户端)用python写了一个程序,远程连接Linux服务器(机器B),并使服务器执行一条指令,代码如下:

服务器端程序:
import os
import sys
import socket

def work():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('0.0.0.0',1000))
sock.listen(5)
while True:
try:
conn,addr = sock.accept()
ret = conn.recv(2048)
result = os.popen(ret).read()
conn.send(result)
except:
sys.exit(0)
sock.close()

if __name__ == '__main__':
work()


客户端程序:
import socket

def socket_send(command):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('10.216.128.246',1000))
sock.send(command)
result = sock.recv(2048)
sock.close()
return result

#commail ='ls'
commail = 'mail -s "Title!" 123456@sina.com
socket_send(commail)


如果客户端程序中使用语句commail ='ls',则程序跑完后自动终止。如果客户端程序中使用commail = 'mail -s "Title!" 123456@sina.com语句,则程序跑完后不会自动终止,会一直跑,需要强制关闭才能退出,强制关闭时弹出是否强制关闭对话框,这是为什么?请问在程序中如何实现执行完mail -s语句后自动退出程序呢?有试过加sys.exit(0)和quit()语句,但还是不能自动退出。



...全文
4484 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhp168168 2016-12-07
  • 打赏
  • 举报
回复
多谢楼上的回复!你的意思是程序这样改吗? 服务器端程序:
import os
import sys
import socket
 
def work():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(('0.0.0.0',1000))
    sock.listen(5)
    while True:
        try:
            conn,addr = sock.accept()
            ret = conn.recv(2048)
            result = os.popen(ret).read()
            conn.send(result)

            if result == 'exit':
                break

        except:
            sys.exit(0)
    sock.close()
 
if __name__ == '__main__':
    work()
客户端程序:
import socket
 
def socket_send(command):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('10.216.128.246',1000))
    sock.send(command)
    result = sock.recv(2048)
    sock.close()
    return result
 
commail = 'mail -s "Title!" 123456@sina.com'
socket_send(commail)
socket_send('exit')
我这样试过,客户端程序运行完后还是不能自动退出。。。
xhp168168 2016-12-07
  • 打赏
  • 举报
回复
明白你的意思,按照你说的方式修改了服务器端程序。运行客户端程序后,socket_send(commail)一直在运行,我在它后面加了一条print调试语句不能打印出来,所以后面的socket_send('exit')语句也就更没法执行了,客户端程序还是不能自动退出。 另外要说明一点,这个服务器端程序我是想让他常驻内存一直执行的,用于随时监听外部客户端机器发过来的要执行的命令。
引用 4 楼 xpresslink 的回复:
看错了应该是这样就可以了。 if ret== 'exit': sock.close() break
混沌鳄鱼 2016-12-07
  • 打赏
  • 举报
回复
看错了应该是这样就可以了。 if ret== 'exit': sock.close() break
混沌鳄鱼 2016-12-07
  • 打赏
  • 举报
回复
退出循环前应该先关掉socket

            if result == 'exit':
               sock.close()
                break
引用 2 楼 xhp168168 的回复:
多谢楼上的回复!你的意思是程序这样改吗? 服务器端程序:
import os
import sys
import socket
 
def work():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(('0.0.0.0',1000))
    sock.listen(5)
    while True:
        try:
            conn,addr = sock.accept()
            ret = conn.recv(2048)
            result = os.popen(ret).read()
            conn.send(result)

            if result == 'exit':
                break

        except:
            sys.exit(0)
    sock.close()
 
if __name__ == '__main__':
    work()
客户端程序:
import socket
 
def socket_send(command):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('10.216.128.246',1000))
    sock.send(command)
    result = sock.recv(2048)
    sock.close()
    return result
 
commail = 'mail -s "Title!" 123456@sina.com'
socket_send(commail)
socket_send('exit')
我这样试过,客户端程序运行完后还是不能自动退出。。。
混沌鳄鱼 2016-12-06
  • 打赏
  • 举报
回复
你这个服务端程序本来就是个死循环的写法。 你应该加个

if result == 'exit':
    break
在客户端发 exit 才能终止。 还有最后的 一句好象少了 一个单引号。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧