从不同目录导入python模块时如何修复导入错误

时间:2019-01-23 19:19:07

标签: python-3.x python-import

我的python项目中有几个目录。

|--main.py
|--sideproject/
|           |--sub_main.py
|           |--test.py
|           |--__init__.py

sub_main在main中是必需的,但是sub_main导入的test.py发生错误

以下代码在运行sub_main时有效,但是当main.py导入sub_main时,该函数将中断并显示“ ModuleNotFoundError:没有名为'test'的模块”

from test import *

通过将其更改为from .test import * main.py可以,但是sub_main不能。

我曾尝试添加空白__init__.py,就像有些人提到的那样,但似乎无济于事。

1 个答案:

答案 0 :(得分:0)

这是一种(不太干净的)方式。

|--main.py
|--sideproject/
|           |--sub_main.py
|           |--test.py
|           |--__init__.py

main.py中:

from sideproject import sub_main    

def func_in_main():
    return sub_main.func_in_sub_main()

if __name__ == "__main__":
    print(func_in_main())

sub_main.py中:

if __name__ == "__main__":
    # If sub_main is run directly.
    # Use regular imports.

    import test
    print(test.func_in_test())
else:
    # If sub_main is imported by main.
    # Need to do imports relative to package.

    from . import test
    def func_in_sub_main():
        return(test.func_in_test())

test.py:

__all__ = ["func_in_test"]    

def func_in_test():
    return 123

init.py中:(空)

结果:

gino:test$ ls
total 8
-rw-rw-r-- 1 gino gino  150  1月 24 09:05 main.py
drwxrwxr-x 3 gino gino 4096  1月 24 08:57 sideproject
gino:test$ python3 main.py
123
gino:test$ cd sideproject
gino:test$ python3 sub_main.py
123

但是我建议考虑一下为什么需要直接运行 sub_main 。我建议考虑使用 sub_main 作为一种公共API声明(或在 init sideproject 作为一个包进行结构化> .py ),然后始终从 main.py 中运行您的应用程序(导入 sideproject )。