我的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
,就像有些人提到的那样,但似乎无济于事。
答案 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 )。