我是python的新手,并且已经在这方面苦苦挣扎了很长一段时间。好的,所以我有一个程序登录到服务器,然后每隔10秒不断ping服务器,看看服务器的状态是否已经改变。在同一个脚本中,我有一个向服务器发送消息的功能。
send方法的一个简单示例:
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 call function within class
Python code to get current function into a variable?
嗨@nFreeze感谢我试图使用ZeroRPC的回复但是每次我运行你给的(明显编辑过的)脚本/示例我都会遇到这个错误:
Traceback (most recent call last):
File "C:\Users\dwake\Desktop\Web Projects\test.py", line 1, in <module>
import zerorpc
File "C:\Python27\lib\site-packages\zerorpc\__init__.py", line 27, in <module>
from .context import *
File "C:\Python27\lib\site-packages\zerorpc\context.py", line 29, in <module>
import gevent_zmq as zmq
File "C:\Python27\lib\site-packages\zerorpc\gevent_zmq.py", line 33, in <module>
import gevent.event
File "C:\Python27\lib\site-packages\gevent\__init__.py", line 48, in <module>
from gevent.greenlet import Greenlet, joinall, killall
File "C:\Python27\lib\site-packages\gevent\greenlet.py", line 6, in <module>
from gevent.hub import greenlet, getcurrent, get_hub, GreenletExit, Waiter
File "C:\Python27\lib\site-packages\gevent\hub.py", line 30, in <module>
greenlet = __import__('greenlet').greenlet
ImportError: No module named greenlet
即使我已经安装了gevent。我不知道如何解决这个问题。现在一直在谷歌搜索一个小时。
答案 0 :(得分:2)
您正在寻找的是RPC服务器。它允许外部客户端在您的应用程序中执行公开的功能。幸运的是python有很多RPC options。 ZeroRPC可能是我最喜欢的,因为它易于使用并支持node.js.以下是如何使用ZeroRPC公开send方法的示例:
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!")
答案 1 :(得分:0)
最简单的方法是使用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。