Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将命令从命令行发送到Unix中运行的Python脚本_Python_Unix_Client Server - Fatal编程技术网

将命令从命令行发送到Unix中运行的Python脚本

将命令从命令行发送到Unix中运行的Python脚本,python,unix,client-server,Python,Unix,Client Server,我想构建一个可以在从其他脚本运行时进行控制的脚本。例如,我希望按如下方式运行脚本: ~: Server & 并且能够运行其中一个功能,如: ~: client func1 在我的搜索中,我发现信号模块有我想要的东西,但它的信号是预定义的,我不能发送自己的信号 我甚至不喜欢使用网络框架的客户机/服务器实现,但我认为这对于我希望脚本具有的功能来说太多了 谢谢大家。所以您需要与正在运行的进程对话,对吗?unix域套接字的想法如何 在您的服务器中,您可以在unix文件系统的路径上构建一个套接

我想构建一个可以在从其他脚本运行时进行控制的脚本。例如,我希望按如下方式运行脚本:

~: Server &
并且能够运行其中一个功能,如:

~: client func1
在我的搜索中,我发现信号模块有我想要的东西,但它的信号是预定义的,我不能发送自己的信号

我甚至不喜欢使用网络框架的客户机/服务器实现,但我认为这对于我希望脚本具有的功能来说太多了


谢谢大家。

所以您需要与正在运行的进程对话,对吗?unix域套接字的想法如何

在您的服务器中,您可以在unix文件系统的路径上构建一个套接字,然后与客户端中的该套接字通信,如我在Google上搜索的链接所述:


如果您只尝试向服务器发送一个方向的命令,那么使用Python的命令比您想象的要简单。当然,代码示例是赤裸裸的,因为它们不进行错误处理,也不多次调用
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)

您是否假设客户端和服务器在同一台机器上运行?如果没有,你将需要联网。我使用Gtk信号-不带窗口或图形部分-一切正常且快速。但是我使用Openbox/Gnome。我认为平台本机信号方法的开销很小。@merlin2011我更愿意假设客户机和服务器运行在同一台机器上,因为从另一方面来说,正如我所说的,这将远远超过我想要的@沙欣主义,我不那么肯定。我正在为您准备一个答案,我想您会发现它比您预期的要简单。@merlin2011谢谢您,正如您和oodograss所说,socket是解决方案。@Shahinism,谢谢您的编辑。正如你所看到的,我在剥离这些示例时并没有得到所有信息您可以向多个解释器实例广播消息吗?例如,如果您有一个web服务器正在运行,您是否可以向当前运行的每个处理程序广播一个信号,并说“如果您的用户有此id,请注销”@KevinOrr,我想您正在寻找,但如果这不足以帮助您,请问一个新问题。我试图修复/编辑上述代码中的一个错误,但由于某种原因被拒绝。无论如何,服务器代码中的线程是使用
ct.run()
而不是
ct.start()
启动的,这意味着它实际上不是并行执行(作为线程),而是作为正常的阻塞代码。这意味着线程和语句
serversocket.listen(10)
不能同时处理多个连接。也就是说,只有当客户端在处理函数中完成连接时,才会访问函数
accept()