在python模块中访问全局变量
如何访问模块内的所有全局变量(我不知道它们是谁) 比如说 文件m.py:在python模块中访问全局变量,python,module,global-variables,Python,Module,Global Variables,如何访问模块内的所有全局变量(我不知道它们是谁) 比如说 文件m.py: def a(s): exec('print '+s) def a(s): print s 主要代码: import m x=2 m.a('x*2') import m x=2 m.a(x * 2) 您希望在此处使用eval(),而不是exec() 但是你到底想做什么呢?…eval()和exec()的用法通常是不好的,而且通常是不需要的(特别是在涉及到安全问题时)。你想在这里使用eval()而不是ex
def a(s):
exec('print '+s)
def a(s):
print s
主要代码:
import m
x=2
m.a('x*2')
import m
x=2
m.a(x * 2)
您希望在此处使用eval(),而不是exec()
但是你到底想做什么呢?…eval()和exec()的用法通常是不好的,而且通常是不需要的(特别是在涉及到安全问题时)。你想在这里使用eval()而不是exec()
但是你到底想做什么呢?…eval()和exec()的用法通常是不好的,而且通常是不需要的(特别是在涉及到安全问题时)。你可以通过直接导入特殊的
\uuu main\uu
模块来破解它。在m.py
中:
def print_global(name):
import __main__
print getattr(__main__, name)
在主模块中:
import m
x = 2
m.print_global('x') # prints 2
虽然此示例演示了如何通过编程方式使用名称空间,但这是一种应该尽量少做的事情。您可以通过直接导入特殊的
\uuuuu main\uuu
模块来破解它。在m.py
中:
def print_global(name):
import __main__
print getattr(__main__, name)
在主模块中:
import m
x = 2
m.print_global('x') # prints 2
虽然这个示例演示了如何通过编程方式使用名称空间,但这是一种应该尽量少做的事情。为什么不能直接使用它(好吧,如果你真的有字符串,但是既然它几乎都是在代码中,看起来你出于某种原因在它周围有字符串)
(重新编写代码):
文件m.py:
def a(s):
exec('print '+s)
def a(s):
print s
主要代码:
import m
x=2
m.a('x*2')
import m
x=2
m.a(x * 2)
为什么不能直接使用(好吧,如果你真的有字符串的话,但是既然它几乎都是在代码中,看起来你好像出于某种原因在它周围有字符串)
(重新编写代码):
文件m.py:
def a(s):
exec('print '+s)
def a(s):
print s
主要代码:
import m
x=2
m.a('x*2')
import m
x=2
m.a(x * 2)
不要使用
exec()
处理类似的内容。这不是做这项工作的好工具。同样,全局变量通常是一个坏主意-将需要的变量传递给函数。您希望打印什么?在m.py
中没有x
…该模块用于执行文本文件中的python命令,我知道这会带来各种安全问题,但对于我的应用程序来说是可以的。目前我使用exefile('m.py'),但我更喜欢使用模块。不要对此类内容使用exec()
。这不是做这项工作的好工具。同样,全局变量通常是一个坏主意-将需要的变量传递给函数。您希望打印什么?在m.py
中没有x
…该模块用于执行文本文件中的python命令,我知道这会带来各种安全问题,但对于我的应用程序来说是可以的。目前我使用execfile('m.py'),但我更喜欢使用模块。eval
在这里不起作用,因为print
是一个语句——而且无论如何,eval没有任何方法知道x
实际上是什么,除非你传递它globals
和/或locals
字典。@poke--不知道。您仍然存在名称空间访问问题。由于m.py
中没有x
,m.py
中的eval('x')
将失败,并出现namererror
@mgilson抱歉,我只对第一部分进行了响应。eval
在这里不起作用,因为print
是一条语句——无论如何,eval无法知道x
实际上是什么,除非您传递globals
和/或locals
字典。@poke--不,它不会。您仍然存在名称空间访问问题。由于m.py
中没有x
,m.py
中的eval('x')
将失败,出现NameError
@mgilson抱歉,我只对第一部分做出了响应。您测试过这个吗?m
名称空间中的globals应该如何知道x
名称空间中的\uuuuuuu\uuuu
是什么?您测试过这个吗?m
名称空间中的globals应该如何知道x
名称空间中的\uuuu main\uuuu
是什么?实际上,我要执行的命令是以字符串的形式来自文件,而不是以参数的形式。实际上,我要执行的命令是以字符串的形式来自文件,而不是以参数的形式。