无法从另一个文件调用变量

时间:2019-12-30 06:17:07

标签: python-3.x

我有两个文件。第一个文件,我们将其称为“ a.py”。第二个是“ b.py”。

以下是“ a.py”的示例:

#!/usr/bin/env python
# coding=utf-8

CHOOSE = input ('''
         \033[1;35m choose 1 or 2:\033[0m
         1)tom
         2)jack
''')

a = 666
b = "bbb"
def f():
    print("this is a test")
    return "function"

if __name__ == '__main__':
    if CHOOSE == '1':
        username = 'tom'
        print(username)

    elif CHOOSE == '2':
        username = 'jack'
        print(username)

    else:
        print('wrong choice,scipt is exit...')

以下是“ b.py”的示例:

#!/usr/bin/env python
# coding=utf-8

import a
from a import b,f,CHOOSE,username

a = a.a
f()
print(b,a,CHOOSE,username)

当我运行python b.py时,系统反馈错误: enter image description here

我在哪里错了?如何解决?

2 个答案:

答案 0 :(得分:2)

由于此代码段:

if __name__ == '__main__':
    if CHOOSE == '1':
        username = 'tom'
        print(username)

    elif CHOOSE == '2':
        username = 'jack'
        print(username)

    else:
        print('wrong choice,scipt is exit...')

仅当a.py作为未从其他模块导入的主python文件运行时,才会执行,因此username将不会定义,因此无法导入。这里是如何解决它:

a.py

...

def foo(CHOOSE):
    if CHOOSE == '1':
        username = 'tom'

    elif CHOOSE == '2':
        username = 'jack'

    else:
        username = None

    return username

b.py

from a import foo
CHOOSE = input ('''
         \033[1;35m choose 1 or 2:\033[0m
         1)tom
         2)jack
''')

username = foo(CHOOSE)
if username:
    print(username)
else:
    print('Wrong choice')

说明:首先,您需要将计算名称的代码提取为可重用的代码。函数是为了实现代码的可重用性,因此我定义了一个带有一个参数的参数,并返回相应的值。然后在b.py中使用(导入然后调用)此函数。

通常将if __name__ == '__main__':放在您认为是入口点的模块中,因此,如果要使用它,也许b.py是一个更好的地方。

答案 1 :(得分:0)

只有在以if __name__ == '__main__' main 模块的情况下运行脚本时,才触发块a.py(例如,使用命令python a.py运行该脚本)。如果将其他任何东西用作主模块,并且导入了a,则将不满足此条件,并且其中的代码也不会运行。

已创建变量username,并将其添加到a块中的if __name__ == '__main__'的命名空间中。当您执行python b.py时,此块内的代码将不会执行,因此username永远不会被添加到命名空间中。因此,当您尝试导入它时,在加载文件a之后立即会收到一条错误消息,指出'username'不存在-从未创建。