为什么不能加载模块?
Why can't load the module?
显示我的project
的目录结构:
tree project
project
├── config.py
├── __init__.py
└── project.py
project.py中的内容:
from . import config
def main():
pass
if __name__ == '__main__':
main()
__init__.py
中的内容:
__all__ = ['project','config']
from project import *
from . import config
config.py
为简单起见留空。
加载模块:
cd project
import project
遇到错误信息: Parent module '' not loaded, cannot perform relative import
为什么不能 import project
?
我发现如果 project.py
重命名为 myproject.py
,其他保持不变,import project
可以工作。
包 project
是否与模块 project.py
共享相同的名称?
为什么同名很重要?
根据这个答案:
What does __all__
do?
It declares the semantically "public" names from a module. If there is a name in all, users are expected to use it, and they can have the expectation that it will not change.
`all = ['foo', 'Bar']
means that when you import * from the module, only those names in the all are imported.
因此,如果您想在 project.py
文件中导入任何内容,则无需定义 __all__
。另外我认为你应该导入一个文件而不是他们的路径。
所以,在你的 __init__
文件中,它应该是这样的。
from .project import *
from .config import *
如果您尝试查看 project.py
中的 __package__
,您会发现当您在 import project
文件夹中查看 import project
时,它从无变化,当您import project
就在文件夹外面。这是因为,当您在文件夹内时,您正在导入 module project
(即 project.py
文件),并从 project/
您正在导入 project
软件包 的文件夹(即您是 运行 __init__.py
文件)。
当写from . import x
时,你期望从当前包中导入x
,但是没有包上下文,因此它不能import .
显示我的project
的目录结构:
tree project
project
├── config.py
├── __init__.py
└── project.py
project.py中的内容:
from . import config
def main():
pass
if __name__ == '__main__':
main()
__init__.py
中的内容:
__all__ = ['project','config']
from project import *
from . import config
config.py
为简单起见留空。
加载模块:
cd project
import project
遇到错误信息: Parent module '' not loaded, cannot perform relative import
为什么不能 import project
?
我发现如果 project.py
重命名为 myproject.py
,其他保持不变,import project
可以工作。
包 project
是否与模块 project.py
共享相同的名称?
为什么同名很重要?
根据这个答案:
What does
__all__
do?
It declares the semantically "public" names from a module. If there is a name in all, users are expected to use it, and they can have the expectation that it will not change.
`all = ['foo', 'Bar'] means that when you import * from the module, only those names in the all are imported.
因此,如果您想在 project.py
文件中导入任何内容,则无需定义 __all__
。另外我认为你应该导入一个文件而不是他们的路径。
所以,在你的 __init__
文件中,它应该是这样的。
from .project import *
from .config import *
如果您尝试查看 project.py
中的 __package__
,您会发现当您在 import project
文件夹中查看 import project
时,它从无变化,当您import project
就在文件夹外面。这是因为,当您在文件夹内时,您正在导入 module project
(即 project.py
文件),并从 project/
您正在导入 project
软件包 的文件夹(即您是 运行 __init__.py
文件)。
当写from . import x
时,你期望从当前包中导入x
,但是没有包上下文,因此它不能import .