从 __init__.py 导入方法

Che*_*ffs 11 python python-module

在 python 中导入模块时遇到一些问题。这是我的文件夹结构

my_app/
    app.py
    __init__.py (I want to import a function from this file)
    folder1/
        __init.py
        method1.py
    folder2/
        __init__.py
        method.py
Run Code Online (Sandbox Code Playgroud)

在我的根中,__init__.py我有这个功能

def want_to_be_run_elsewhere():
    pass
Run Code Online (Sandbox Code Playgroud)

在我的 app.py 中,我想导入这个函数并在我启动我的应用程序时运行它,但我不确定如何去做。

from my_app import want_to_be_run_elsewhere
Run Code Online (Sandbox Code Playgroud)

这会抛出一个名为 my_app 的无模块

据我所知,我拥有所有必要的__init__.py文件,所以它可能与 sys.path 相关?

我在这里阅读了一些类似的主题,但我无法解决这个问题。

Nil*_*ner 6

通常你会像这样导入

from . import want_to_be_run_elsewhere
Run Code Online (Sandbox Code Playgroud)

这在这里不起作用,因为您正在调用app.py. 如果你 import my_app.app,它是模块的一部分。如果你叫它不是。从正在使用的模块导入.将不起作用。

你可以移动 app.py到 之外my_app,将其从模块中删除并再次使导入工作。

或者你可以使用

from __init__ import want_to_be_run_elsewhere
Run Code Online (Sandbox Code Playgroud)

app.py

我相信

from my_app import want_to_be_run_elsewhere
Run Code Online (Sandbox Code Playgroud)

只有当你实际上有pip install -e my_app/. 那么它也应该工作。

  • 我会删除使用 `from __init__ import ...` 的建议。这不是正确的做事方式。如果子模块中的某些代码取决于包名称,它甚至可以破坏代码(例如,如果您直接使用像`pickle` 或`shleve` 等模块,使用该解决方案会使数据不可读)。 (4认同)