因此,假设我对两台计算机都拥有完全控制权,那么我将它们分别称为计算机A和计算机B。
在计算机A上,有一个python脚本在后台运行并具有多种功能,其中一个功能可以创建并显示消息框:(这只是一个示例)
def msg_box(text,title):
MessageBox = ctypes.windll.user32.MessageBoxW
MessageBox(None, text, title, 0)
我想做的是从计算机B访问在计算机A上运行的脚本的功能,在使用msg_box函数的情况下,我希望能够在计算机B上使用我拥有的任何参数来调用它想要,它将在计算机A上执行。我是初学者,并且我不知道如何在计算机之间建立此链接,我提醒您,我对这两个计算机都拥有完全控制权,并且它们已连接到我的本地网络。有人建议我使用ssh服务器,有人可以给我一些想法吗?
答案 0 :(得分:0)
这听起来像是Pyro4 package的工作。这是一个基于他们的"Simple Example"的示例,并带有一些额外的代码来自动启动名称服务器并通过网络进行监听。
首先在每台计算机上使用此命令来安装Pyro4:
pip install pyro4
在服务器上,将此脚本另存为server.py
,然后通过python server.py
在终端窗口中运行它:
# saved as server.py
import Pyro4, Pyro4.naming
import socket, threading
# Define an object that will be accessible over the network.
# This is where all your code should go...
@Pyro4.expose
class MessageServer(object):
def show_message(self, msg):
print("Message received: {}".format(msg))
# Start a Pyro nameserver and daemon (server process) that are accessible
# over the network. This has security risks; see
# https://pyro4.readthedocs.io/en/stable/security.html
hostname = socket.gethostname()
ns_thread = threading.Thread(
target=Pyro4.naming.startNSloop, kwargs={'host': hostname}
)
ns_thread.daemon = True # automatically exit when main program finishes
ns_thread.start()
main_daemon = Pyro4.Daemon(host=hostname)
# find the name server
ns = Pyro4.locateNS()
# register the message server as a Pyro object
main_daemon_uri = main_daemon.register(MessageServer)
# register a name for the object in the name server
ns.register("example.message", main_daemon_uri)
# start the event loop of the main_daemon to wait for calls
print("Message server ready.")
main_daemon.requestLoop()
在客户端上,将其另存为client.py
并使用python client.py
运行它:
# saved as client.py
import Pyro4
import sys
print("What is your message?")
msg = sys.stdin.readline().strip()
# lookup object uri on name server and create a proxy for it
message_server = Pyro4.Proxy("PYRONAME:example.message")
# call method on remote object
message_server.show_message(msg)
请注意,将Pyro设置为侦听您的网络存在安全风险。因此,在进行此操作之前,您应该阅读他们的section on security。但这足以让您入门。
如果您想要一个仅使用标准库的解决方案,则可以在a different answer中查看我基于套接字的客户端-服务器设置。或者,您可以考虑在服务器上设置flask
网络服务器,然后在客户端上使用urllib2
访问服务器并调用正确的操作(可能通过GET
或{{1 }}请求)。但是这些都比这困难得多。
另一个选择是使用不同的进程间通信程序包,例如PyZMQ,redis,mpi4py或zmq_object_exchanger。有关一些想法,请参见this question。