我有两个文件a.py和b.py如下:
a.py
import b.py
Test="abc"
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
args = parser.parse_args()
main(args)
b.py
import a
print a.Test
编辑:输出:
python a.py
abc
所以基本上我的问题是为什么测试变量没有在b.py中更新,我怎么能让它工作?感谢。
答案 0 :(得分:1)
import a
a.main()
print a.Test
a.Test = "new Value"
print a.Text
您永远不会调用main函数。导入模块时,__name__
不是"__main__"
,因此您的main()永远不会运行。当你直接运行a.py时,它将运行main()
答案 1 :(得分:0)
您需要考虑导入执行的顺序。考虑这些工作文件。
a.py
print("Entering a")
import argparse
import b
Test="abc"
print("Id of Test: ", id(Test))
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
print('Entering main')
parser = argparse.ArgumentParser()
parser.add_argument('--target', dest='target', type=str)
args = parser.parse_args()
main(args)
b.py
print("Entering b")
import a
print a.Test
def fun():
pass
控制台产生以下内容:
$ python a.py
Entering a
Entering b
Entering a
('Id of Test: ', 40012016L)
abc
('Id of Test: ', 40012016L)
Entering main
问题是,当你导入python模块/文件时,你将立即执行该模块中的所有语句。因此,您的依赖项(也称为导入)存在问题,因为b正在导入“测试”的值之前已经更正了#39;然后立即采取行动。
考虑两个变化。首先,引入包含此配置信息的第三个文件config.py
,并且b不导入。其次,将所有需要b中需要此配置的语句移动到由a调用/ bootstrapped的函数中,显然是这样。
我有一个解决方案,只通过修改b.py
来证明这个问题def fun(): # Added because your main calls this. An error?
pass
from a import Test, main
import a
print Test # prints 'abc'
print a.Test # prints 'abc'
main()
print Test # prints 'abc'
print a.Test # prints 'klm'
在python解释器中,我可以生成以下内容:
>>> import b
abc
abc
abc
klm
在您的代码中,您创建一个名为Test
的新变量,其命令from a import Test
指向原始字符串对象。您实际上想要访问模块Test
拥有的a
变量。
答案 2 :(得分:0)
在a.py中,你在if语句中运行main:
$scope.$watch('fieldcontainer',
function(newValue, oldValue) {
if (newValue && oldValue && newValue != oldValue) {
// here what to do
}
}), true;
如果是主脚本,则只执行main()。导入模块时,if块中的所有代码都不会运行,因为它不是主脚本。要调用main方法,请删除if语句或只在b.py中调用main。