【问题标题】:How to import a sub-module into a package's __init__.py in Python3?如何在 Python3 中将子模块导入到包的 __init__.py 中?
【发布时间】:2020-05-05 21:28:21
【问题描述】:

假设我有以下程序结构:

.
├── main.py
└── mypack
    ├── __init__.py
    └── mymod.py

mypack 包中,可以使用以下语法在(子)模块中导入对象:from .mymod import f

mypack/__init__.py

from .mymod import f

print(f'Hello: __name__: {__name__}, __package__: {__package__}, __file__: {__file__}')

但是,如果我尝试导入完整的(子)模块,则会收到以下语法错误:

import .mymod
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import mypack
  File "/Users/nlykkei/python-demo/mypack/__init__.py", line 1
    import .mymod
           ^
SyntaxError: invalid syntax

另外,如果我尝试使用非相对语法导入模块,它会失败:

import mymod

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import mypack
  File "/Users/nlykkei/python-demo/mypack/__init__.py", line 1, in <module>
    import mymod
ModuleNotFoundError: No module named 'mymod'

如何将(子)模块导入到包的__init__.py 文件中?特别是,我想导入模块对象,导入其所有包含的对象:from .mymod import *

程序输出

$ python3 main.py
Hello: __name__: mypack.mymod, __package__: mypack, __file__: /python-demo/mypack/mymod.py
Hello: __name__: mypack, __package__: mypack, __file__: /python-demo/mypack/__init__.py
Hello: __name__: __main__, __package__: None, __file__: main.py

【问题讨论】:

  • 你试过from mymod import f吗?

标签: python python-3.x module pip package


【解决方案1】:

不确定我是否完全理解了这个问题,但也许:

from . import mymod

【讨论】:

    【解决方案2】:

    检查您的__init__.py 文件

    错误:

    Traceback (most recent call last):
      File "main.py", line 1, in <module>
        import mypack
      File "/Users/nlykkei/python-demo/mypack/__init__.py", line 1, in <module>
        import mymod
    ModuleNotFoundError: No module named 'mymod'
    

    声明你没有导入.mymod,而是mymod

    【讨论】:

    • 那你还没有完全阅读我的问题。那只是为了展示我尝试过的其他东西。
    • __init__ 中,您声明了您的模块内容是什么(您想要公开的内容),因此您不能执行 import mymod 是正常的。您需要从模块文件 .mymod 中明确声明要导入/导出的内容,可以声明 * 或列出所有要公开的函数、对象
    • 如果我想暴露(子)模块对象本身怎么办?例如。 import mynod as foo?模块也是一个对象,所以它应该是可暴露的。
    • 在文件夹 mypack/ 的 __init__.py 中,您定义的模块是 mypack。
    • 是的,mymod.py 是一个子模块。
    猜你喜欢
    • 2013-07-29
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2012-10-16
    • 2015-07-30
    • 2012-11-25
    • 2013-04-21
    相关资源
    最近更新 更多