我是python的新手,已经为此挣扎了很长一段时间。我有一个程序,它登录到服务器,然后每隔10秒不断地ping服务器,看看服务器的状态是否发生了变化。在同一个脚本中,我有一个函数发送消息到服务器。
发送方法的一个简单示例:
def send(self, message):
url = ("https://testserver.com/socket?message=%s") % (message)
req = urllib2.Request(url, None, None)
response = urllib2.urlopen(req).read()
print response
是否有可能让我从另一个脚本调用这个方法,而这个脚本正在运行?就像使用相同的会话一样。似乎当我运行调用这个函数的脚本时,它会创建一个新的实例,而不是使用该脚本的当前实例,导致它抛出异常,说我没有连接到服务器。
对不起,我的问题很幼稚。我试着用谷歌搜索了一段时间,但我似乎找不到答案。我已经阅读了以下内容,但这些都没有解决问题:
类内的Python调用函数
Python代码将当前函数转换为变量?
嗨@nFreeze谢谢你的回复,我曾试图使用ZeroRPC,但每次我运行脚本/你给的例子(显然编辑)我遇到这个错误:
Traceback (most recent call last):
File "C:UsersdwakeDesktopWeb Projectstest.py", line 1, in <module>
import zerorpc
File "C:Python27libsite-packageszerorpc__init__.py", line 27, in <module>
from .context import *
File "C:Python27libsite-packageszerorpccontext.py", line 29, in <module>
import gevent_zmq as zmq
File "C:Python27libsite-packageszerorpcgevent_zmq.py", line 33, in <module>
import gevent.event
File "C:Python27libsite-packagesgevent__init__.py", line 48, in <module>
from gevent.greenlet import Greenlet, joinall, killall
File "C:Python27libsite-packagesgeventgreenlet.py", line 6, in <module>
from gevent.hub import greenlet, getcurrent, get_hub, GreenletExit, Waiter
File "C:Python27libsite-packagesgeventhub.py", line 30, in <module>
greenlet = __import__('greenlet').greenlet
ImportError: No module named greenlet
尽管我已经安装了gevent。我不知道怎么解决这个问题。我已经搜了一个小时了
您正在寻找的称为RPC服务器。它允许外部客户端在你的应用程序中执行暴露的函数。幸运的是,python有很多RPC选项。ZeroRPC可能是我最喜欢的,因为它易于使用并且支持node.js。下面是如何使用ZeroRPC公开发送方法的示例:
在你的应用程序(服务器)
import zerorpc
class HelloRPC(object):
def send(self, message):
url = ("https://testserver.com/socket?message=%s") % (message)
req = urllib2.Request(url, None, None)
response = urllib2.urlopen(req).read()
return response
s = zerorpc.Server(HelloRPC())
s.bind("tcp://0.0.0.0:4242")
s.run()
在另一个应用程序(客户端)
import zerorpc
c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")
print c.send("RPC TEST!")
最简单的方法是使用UNIX信号。你不需要第三方库。
# your-daemon.py
import signal
from time import sleep
def main():
while True:
print "Do some job..."
sleep(5)
def send():
print "Send your data"
def onusr1(*args):
send()
if __name__ == '__main__':
signal.signal(signal.SIGUSR1, onusr1)
main()
在终端运行:
$ pgrep -f your-daemon.py | xargs kill -SIGUSR1
当然,这只适用于本地机器。此外,您不能指定任何参数的send
函数,如果你想有许多处理程序,然后使用RPC如下建议。