【问题标题】:Accessing Python namespace from other Python process从其他 Python 进程访问 Python 命名空间
【发布时间】:2019-08-08 18:25:59
【问题描述】:

假设我有以下 Python 脚本script.py:

a = 1
b = 10

for i in range(b):
    a += 1

print(a)

我知道我可以在这个script.py 中使用globals() 来显示命名空间:

{'__file__': 'counter.py', '__doc__': None, 'i': 9, '__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000027C8D9402E8>, '__name__': '__main__', '__cached__': None, 'b': 10, 'a': 11, '__package__': None, '__builtins__': <module 'builtins' (built-in)>}

我想知道您是否可以在script.py 之外以某种方式模仿globals()?换句话说,我想运行other_script.py 并查看script.py 的globals() 输出。 import counter 有用吗?

编辑:如果可能,script.py 的 globals 输出是否可以在 for 循环中以 i 的每个增量进行更新?

【问题讨论】:

  • 你能提供更多的部署细节吗? script.py 和other_script.py 是分别启动(即作为完全独立的进程)还是您打算让一个启动另一个?作为完全精通的进程,我不相信你应该能够做很多事情,但是如果一个是另一个使用 pythons 多处理模块的子进程,你可能会有一些选择。
  • script.py 和 other_script.py 是完全独立的进程。
  • 这可能是一个依赖于操作系统的问题,因为您希望一个进程访问另一个进程的内存。有很多方法可以做到这一点,但很少有方法是简单的。我的建议是不要重新发明轮子:使用数据库(一个简单的 k/v 存储应该像 redis 一样好)或在你的主机脚本中设置一个简单的 Http 服务器。

标签: python import namespaces globals


【解决方案1】:

import counter 的问题在于 counter.py 中的命名空间将更改为您当前的命名空间,因为您将它导入到当前命名空间中。

但是,如果您只想查看 counter.py 输出,则可以使用 exec() 函数单独执行它。这不会改变它的命名空间。

例子:

在 counter.py 中:

a = 1
b = 10

for i in range(b):
    print('\na = ', a)
    print('globals = ', globals())
    a += 1

print('\na = ', a)
print('globals = ', globals())

在other_script.py:

exec(open('counter.py').read())

【讨论】:

  • 感谢您的回答。假设counter.py 文件中没有打印语句。是否仍然可以看到变量a、b 和i 的值?当前使用exec(open('counter.py').read()) 的方法会产生空输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
相关资源
最近更新 更多