【问题标题】:Send commands from command line to a running Python script in Unix从命令行向 Unix 中正在运行的 Python 脚本发送命令
【发布时间】:2014-04-18 05:55:03
【问题描述】:

我想构建一个可以在从另一个脚本运行时进行控制的脚本。例如,我想像这样运行我的脚本:

~: Server &

并且能够运行它的功能之一,例如:

~: client func1

在我的搜索中,我发现信号模块有我想要的东西,但它的信号是预定义的,我无法发送自己的信号。

我虽然是使用网络框架的客户端/服务器实现,但我认为这对于我希望我的脚本具有的能力来说太过分了。

谢谢大家。

【问题讨论】:

  • 您是否假设客户端和服务器在同一台机器上运行?如果没有,您将需要网络。
  • 我使用 Gtk 信号 - 没有窗口或图形部分 - 一切都很好而且很快。但我使用 Openbox/Gnome。我认为平台原生信号方法只需很少的开销即可完成这项工作。
  • @merlin2011 我更愿意假设客户端和服务器在同一台机器上运行,因为正如我所说的那样,这将远远超出我想要的!
  • @Shahinism,我不太确定。我正在为您准备一个答案,我认为您会发现它比您预期的要简单。
  • @merlin2011 谢谢你,正如你和 oodograss 所说,socket 是解决方案。

标签: python unix client-server


【解决方案1】:

如果您只是尝试向服务器单向发送命令,使用 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)

【讨论】:

  • @Shahinism,感谢您的编辑。正如你所看到的,当我剥离这些例子时,我并没有得到所有的东西。 :P
  • 您可以向多个解释器实例广播消息吗?就像你有一个正在运行的 Web 服务器一样,你能否向当前正在运行的每个处理程序广播一个信号并说“如果他有这个 id,则注销你的用户”?
  • @KevinOrr,我认为您正在寻找this question,但如果这不足以帮助您,请提出一个新问题。
  • 我尝试修复/编辑上述代码中的错误,但由于某种原因被拒绝。无论如何,服务器代码中的线程是使用ct.run() 而不是ct.start() 启动的,这意味着它实际上不是并行执行(作为线程),而是作为正常的阻塞代码执行。这意味着不能按照线程和语句serversocket.listen(10) 的预期同时处理多个连接。即,函数accept() 只有在客户端完成处理函数中的连接时才会到达。
【解决方案2】:

所以您需要与正在运行的进程对话,对吗? unix domain socket 的思路怎么样?

在您的服务器中,您可以在您的 unix 文件系统的路径上建立一个套接字,然后在您的客户端中与该套接字通信,就像我在谷歌上搜索的这个链接中描述的那样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2011-03-10
    • 2012-04-01
    相关资源
    最近更新 更多