导入多个python脚本时在哪里进行包导入?

Where to do package imports when importing multiple python scripts?

这可能是以前的答案,但我找不到任何解决我问题的方法。

所以,我有两个文件。

1
2
3
|
|-- test.py
|-- test1.py

测试1.py如下

1
2
def fnc():
    return np.ndarray([1,2,3,4])

我尝试从测试中调用test1并像这样调用函数

1
2
from test1 import *
x = fnc()

现在我很自然地得到了NameError: name 'np' is not defined

我试图将test和test1中的import编写为

1
import numpy as np

但是,我还是得到了错误。这可能很愚蠢,但我到底错过了什么?

感谢您的帮助。事先谢谢。


每个python模块都有自己的名称空间,因此如果test1.py中的某些函数依赖于numpy,则必须在test1.py中导入numpy:

1
2
3
4
5
6
# test1.py

import numpy as np

def fnc():
    return np.ndarray([1,2,3,4])

如果test.py不直接使用numpy,则不必再次导入它,即:

1
2
3
4
5
6
7
8
9
10
# test.py

# NB: do NOT use 'from xxx import *' in production code, be explicit
# about what you import

from test1 import fnc

if __name__ =="__main__":
    result = fnc()
    print(result)

现在,如果test.py还想使用numpy,它也必须导入它——正如我所说,每个模块都有自己的名称空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# test.py

# NB: do NOT use 'from xxx import *' in production code, be explicit
# about what you import

import numpy as np
from test1 import fnc


def other():
    return np.ndarray([3, 44, 5])

if __name__ =="__main__":
    result1 = fnc()
    print(result1)

    result2 = other()
    print(result2)

请注意,如果您在python shell中测试代码,那么仅仅修改源代码并在python shell中重新导入代码将无法工作(每个进程只加载一次模块,随后的导入将从sys.modules缓存中获取已加载的模块),因此您必须退出shell并打开一个新的shell。


大多数情况下,你需要在你有这些文件的目录中输入init。只需尝试在.py文件所在的目录中创建in it.py文件,看看是否有帮助。

1
touch __init__.py