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

从已经运行的python脚本调用方法,python,python-2.7,python-3.x,gevent,greenlets,Python,Python 2.7,Python 3.x,Gevent,Greenlets,我是python新手,已经为此奋斗了很长一段时间。好的,我有一个程序,它登录到一个服务器,然后每隔10秒不断ping服务器,看看服务器的状态是否发生了变化。在同一个脚本中,我有一个向服务器发送消息的函数 send方法的一个简单示例: def send(self, message): url = ("https://testserver.com/socket?message=%s") % (message) req = urllib2.Request(url, None, None

我是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
当这个脚本正在运行时,我是否可以从另一个脚本调用这个方法?就像使用同一个会话一样。似乎当我运行调用此函数的脚本时,它会创建一个新的脚本实例,而不是使用该脚本的当前实例,从而导致脚本抛出异常,表示我未连接到服务器

对不起,我的问题是noob。我在谷歌上搜索了一段时间,但似乎找不到答案。我已经阅读了以下内容,但这些并没有解决问题:

您好@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
回溯(最近一次呼叫最后一次):
文件“C:\Users\dwake\Desktop\Web Projects\test.py”,第1行,在
导入零RPC
文件“C:\Python27\lib\site packages\zerorpc\\uuuuu init\uuuuuuu.py”,第27行,在
from.context导入*
文件“C:\Python27\lib\site packages\zerorpc\context.py”,第29行,在
将gevent_zmq作为zmq导入
文件“C:\Python27\lib\site packages\zerorpc\gevent_zmq.py”,第33行,在
导入gevent.event
文件“C:\Python27\lib\site packages\gevent\\uuuu init\uuuuu.py”,第48行,在
从gevent.greenlet导入greenlet、joinall、killall
文件“C:\Python27\lib\site packages\gevent\greenlet.py”,第6行,在
从gevent.hub导入greenlet、getcurrent、get_hub、GreenletExit、服务员
文件“C:\Python27\lib\site packages\gevent\hub.py”,第30行,在
greenlet=\uuuu导入\uuuu('greenlet')。greenlet
ImportError:没有名为greenlet的模块

即使我已经安装了gevent。我不知道如何解决这个问题。你已经在谷歌上搜索了一个小时。

你要找的是一个服务器。它允许外部客户端在应用程序中执行公开的功能。幸运的是,python有很多。可能是我的最爱,因为它易于使用并支持node.js。以下是如何使用ZeroRPC公开发送方法的示例:

在应用程序(服务器)中 在其他应用程序(客户端)中
你要找的是服务器。它允许外部客户端在应用程序中执行公开的功能。幸运的是,python有很多。可能是我的最爱,因为它易于使用并支持node.js。以下是如何使用ZeroRPC公开发送方法的示例:

在应用程序(服务器)中 在其他应用程序(客户端)中
最简单的方法是使用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。

最简单的方法是使用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。

一个简单的方法是让两个线程在同一个进程中同时运行,一个线程ping服务器,另一个线程执行您喜欢的任何其他逻辑。多线程意味着执行的两个“线程”都以公平的方式分配CPU时间,并共享相同的内存和进程空间。或者,您可以让脚本A写入文件,脚本B检查文件是否有更新,或者使用类似的机制(sqlite数据库、管道…),但您应该了解的是,您的心智模型需要更正。默认情况下,正在运行的程序(在本例中为python程序)不会自动成为某种智能代理,其他程序可以自动与之对话并使用适当的值对其作出响应。默认情况下,程序只知道它们内部发生了什么,以及它们自己决定要与之交互的内容。谢谢,我实际上已经为java编程了大约一年了。具备c#和perl知识。我知道程序不会立刻变小。谢谢你指出这一点,尽管这是很有建设性的。我需要做的是将参数传递给已经创建的方法实例。我本来打算尝试删除文件,但除非我编写一个清理过程(无需编写更多代码),否则这会变得很混乱。一个简单的方法是让两个线程在同一个过程中同时运行,一个线程ping服务器,另一个线程执行任何其他逻辑。多线程意味着执行的两个“线程”都以公平的方式分配CPU时间,并共享相同的内存和进程空间。或者,您可以让脚本A写入文件,脚本B检查文件是否有更新,或者使用类似的机制(sqlite数据库、管道…),但您应该了解的是,您的心智模型需要更正。默认情况下,正在运行的程序(在本例中为python程序)不会自动成为某种智能代理,其他程序可以自动与之对话并使用适当的值对其作出响应。默认情况下,程序只知道它们内部发生了什么,以及它们自己决定要与之交互的内容。谢谢,我实际上已经为java编程了大约一年了。具备c#和perl知识。我知道程序不会立刻变小。谢谢你指出这一点,尽管这是很有建设性的。我需要做的是将参数传递给已经创建的方法实例。我本来打算尝试删除文件,但如果我不编写清理过程的代码(无需编写更多代码),这会变得很混乱。@MethodMan-你在运行什么操作系统?嗨,正在运行windows。我终于设法用一个预com来修复它