从命令行向正在运行的Unix Python脚本发送命令
我想写一个脚本,可以在运行时被其他脚本控制。比如,我想这样运行我的脚本:
~: Server &
然后能够调用它的某个功能,比如:
~: client func1
在我搜索的过程中,我发现了一个叫做信号模块的东西,感觉它有点像我想要的,但是它的信号是预先定义好的,我不能发送我自己的信号。
我甚至考虑过用网络框架做一个客户端/服务器的实现,但我觉得这对我想要的功能来说有点过于复杂了。
谢谢大家。
2 个回答
4
所以你想和一个正在运行的程序交流,对吧?那你可以考虑使用Unix域套接字这个概念。
在你的服务器上,你可以在Unix文件系统的某个路径上创建一个套接字,然后在你的客户端通过这个套接字进行交流,就像我在网上找到的这个链接里描述的那样:
11
如果你只是想把指令单向发送到服务器,其实 比你想象的要简单,可以使用Python的 套接字(Sockets)。这里的代码示例非常基础,因为它们没有处理错误,也没有多次调用 recv
来确保消息完整。这样做只是为了让你明白,处理指令所需的代码行数其实很少。
下面是一个服务器程序,它只是接收消息并打印到 stdout
。注意,我们使用了线程,这样服务器就可以同时监听多个客户端的请求。
import socket
from threading import Thread
MAX_LENGTH = 4096
def handle(clientsocket):
while 1:
buf = clientsocket.recv(MAX_LENGTH)
if buf == '': return #client terminated connection
print buf
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
PORT = 10000
HOST = '127.0.0.1'
serversocket.bind((HOST, PORT))
serversocket.listen(10)
while 1:
#accept connections from outside
(clientsocket, address) = serversocket.accept()
ct = Thread(target=handle, args=(clientsocket,))
ct.start()
接下来是一个客户端程序,它会向服务器发送指令。
import socket
import sys
HOST = '127.0.0.1'
PORT = 10000
s = socket.socket()
s.connect((HOST, PORT))
while 1:
msg = raw_input("Command To Send: ")
if msg == "close":
s.close()
sys.exit(0)
s.send(msg)