从命令行向正在运行的Unix Python脚本发送命令

5 投票
2 回答
12230 浏览
提问于 2025-04-18 03:14

我想写一个脚本,可以在运行时被其他脚本控制。比如,我想这样运行我的脚本:

~: Server &

然后能够调用它的某个功能,比如:

~: client func1

在我搜索的过程中,我发现了一个叫做信号模块的东西,感觉它有点像我想要的,但是它的信号是预先定义好的,我不能发送我自己的信号。

我甚至考虑过用网络框架做一个客户端/服务器的实现,但我觉得这对我想要的功能来说有点过于复杂了。

谢谢大家。

2 个回答

4

所以你想和一个正在运行的程序交流,对吧?那你可以考虑使用Unix域套接字这个概念。

在你的服务器上,你可以在Unix文件系统的某个路径上创建一个套接字,然后在你的客户端通过这个套接字进行交流,就像我在网上找到的这个链接里描述的那样:

http://pymotw.com/2/socket/uds.html

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)

撰写回答