【问题标题】:Strange way to pass data between modules in Python: How does it work?在 Python 中的模块之间传递数据的奇怪方式:它是如何工作的?
【发布时间】:2014-05-07 12:30:02
【问题描述】:

我应该使用一些我自己没有编写的混乱代码,在混乱中我发现了两个以这种奇怪方式进行通信的脚本(通过第三个中间人脚本):

message.py,“中间人”脚本:

class m():
    pass

sender.py,谁想向接收者发送一些信息:

from message import m

someCalculationResult = 1 + 2
m.result = someCalculationResult

receiver.py,谁想打印sender.py产生的一些结果:

from message import m

mInstance = m()
print mInstance.result

而且,神奇的是,在解释器中,导入 sender.py 然后 receiver.py 确实会打印 3...

现在,这里到底发生了什么?我们是否将结果存储到类定义本身并通过特定实例恢复它们?如果是这样,为什么我们不能从定义本身中恢复结果呢?有没有更优雅的方式在解释器中连续运行的脚本之间传递内容?

使用 Python 2.6.6

【问题讨论】:

  • “如果是这样,为什么我们不能从定义本身中恢复结果呢?” - 你可以。创建一个实例是不必要的,但话说回来,整个类也是不必要的。

标签: python class instance interpreter


【解决方案1】:

这只是设置全局变量的一种复杂方式。

m 是一个类,m.result 是一个类属性。发送者和接收者都可以直接访问它,就像他们可以访问m一样。

他们也可以这样做:

# sender
import message
message.result = someCalculationResult

# receiver
import message
print message.result

这里result只是message模块顶层模块中的一个名字。

需要注意的是,您所做的不是运行单独的脚本;您正在将模块导入同一个解释器。如果你先运行python sender.py,而不导入reciever.py,然后单独运行python receiver.py,而不导入sender.py,这整个方案都行不通。

有无数种方法可以将数据从一段代码传递到另一段,这里不胜枚举,都适合不同的场景和需求。例如,线程、单独的进程、单独的计算机都会对消息传递的发生方式和方式产生不同的限制。

【讨论】:

  • 我明白了,我把一件简单的事情复杂化了。猜猜有时在代码中消息被实例化而其他消息并没有增加我的困惑的事实。感谢您的明确解释。
  • 再问一个问题:如果我有这个非常昂贵的 sender.py 脚本(我只想运行一次)和另一个我想不断编辑和运行的 receiver.py(使用来自sender.py),我该如何实现呢?如果我在接收器上导入发件人,它将再次执行昂贵的脚本......(希望我很清楚)(编辑:我想使用解释器来做,但以防万一我想在外面做,真的像你说的那样运行脚本)
  • 您可以使用一个简单的数据库文件(sqlite 如果您了解 SQL,则可以轻松完成此操作)来存储消息。或者使用某种形式的进程间通信。或者您的发送者写入的文件(在它这样做之前将其锁定)并且您的接收者从中读取。等等等等等等。有很多方法可以做到这一点,这里就不一一列举了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多