在python模块中访问全局变量

在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

如何访问模块内的所有全局变量(我不知道它们是谁)

比如说

文件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()而不是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
是什么?实际上,我要执行的命令是以字符串的形式来自文件,而不是以参数的形式。实际上,我要执行的命令是以字符串的形式来自文件,而不是以参数的形式。