2011-05-24 68 views
2

时更具体地说,我有一个文件如何使__name__ == '__main__' 运行模块

文件file1.py:

if __name__ == '__main__': 
    a = 1 

,并从文件file2.py,我想要做的事像

import file1 
print file1.a 

,而无需修改file1.py

+0

我我敢打赌,如果你说出为什么需要这个原因,我们可以给你一个更好的实现方法。 – RoeeK 2011-05-24 17:31:04

+0

描述手头的任务可以帮助您获得更好的解决方案 – 2011-05-24 18:15:08

+1

知道这是否可行,无论它是否是一个好主意,仍然很好。 – mwcz 2011-05-24 18:17:54

回答

4
import imp 
m = imp.find_module('file1') 
file1 = imp.load_module('__main__', *m) 

这就是说,你应该真的考虑修改file1.py而不是使用这个黑客。

+0

完美,谢谢! – Colin 2011-05-24 17:48:03

0

您将需要申报a outsid e的if __name__ == '__main__'范围。目前,它只存在于if区块的范围内。

a = 0 
if __name__ == '__main__': 
    a = 1 
+1

不正确。 python中的语句没有自己的作用域。只有模块,功能和类可以。在这种特殊情况下,'a'是全局名称,如果执行'if',则可以在'if'之外访问。 – 2011-05-24 23:48:02

+0

谢谢你的纠正! – mwcz 2011-05-26 15:46:47

3

你不能;这首先是主要哨兵的目的。如果主标记中定义的变量在其外部是有用的,那么它们应该在其之外定义以便开始。

+0

虽然我同意这是一个坏主意,但你可以(如果需要'execfile'&co)。查看我的答案,为'__name__'更改*相对干净的黑客*。 – phihag 2011-05-24 17:33:36

4
from runpy import run_module 
data = run_module("file1", run_name="__main__") 
print data["a"] 

你不需要惹导入内部做这样的事情的话(并作为额外的奖励,你会避免阻塞你的真正__main__模块命名空间访问)

相关问题