从已经运行的python脚本调用方法



我是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如下建议。

最新更新