![](/img/trans.png)
[英]How to execute the python code below __name__== '__main__ ' *without* using the `subprocess` module?
[英]Execute REPL code in the context of a Python module and not __main__?
我有一个Python实例,上面有一个REPL打开,并导入了几个模块。 我是否可以将代码当作这些模块之一的一部分来运行?
示例:my.module包含如下代码
some_module_var = 123
def my_function():
return 7
我希望能够输入
new_module_var = my_function(some_module_var)
以某种形式放入REPL中,并像执行模块一样执行它,而不是
my.module.new_module_var = my.module.my_function(my.module.some_module_var)
有一个好的解决方案吗?
我已经尝试过的一件事是
exec(compile("my_function(some_module_var)", "<fake_file>", "exec"),
my.module, {})
将模块作为全局命名空间,但是显然,命名空间不能是模块。
另外,作为一种解决方法,我们可以将模块中的每个符号复制到全局名称空间,运行eval,然后复制回更改……这并不像Common Lisp的“只是切换REPL包”那样优雅。解决方案。
还是有可以执行此操作的自定义REPL?
(...我的目标是能够将整个函数发送到正在运行的Python实例,并使它们显示在正确的模块中,而不是在__main__
。)
事实证明, exec()
可以做到这一点。 您传入的不是模块,而是字典:
d = my.module.__dict__
exec("some_module_var = 42", d, d)
exec("print(some_module_var)", d, d)
实际上,这大致就是Python的解释器(从3.6版本开始)在pythonrun.c
(请参阅run_mod()
和PyRun_InteractiveOneObjectEx()
),其中内置__main__
作为模块名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.