从__init__.py中导入方法

15

我在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
在我的根目录下的 __init__.py 文件中,我有这个函数。
def want_to_be_run_elsewhere():
    pass

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

from my_app import want_to_be_run_elsewhere

这会抛出一个“没有名为 my_app 的模块”的错误。

根据我的观察,我已经有了所有必要的__init__.py文件,所以可能与sys.path有关?

我已经阅读了一些类似的主题,但我还没有解决这个问题。


app.py__init__.py是否在my_app/文件夹内? - John Zwinck
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Cheese Puffs
就此而言,通常不会在__init__.py文件中定义函数。它们通常是空的,或者只有一个__all__列表。 - PM 2Ring
嗯,好的。也许我应该考虑移动这个函数。我不想导入__init__,但如果那是唯一的方法,我想我会用另一种方式实现它。谢谢! - Cheese Puffs
我总是喜欢的最简单的方法是,在ipython中使用tab键尝试导入它。例如:import something. <tab> - Akshay
你是在运行脚本时使用 python my_app/app.py 命令吗?那么不要这样做! 要么编写一个外部脚本,这样你就可以将 app.py 放在 my_app 文件夹外面,或者使用 -m 开关:python -m my_app.app - Bakuriu
1个回答

9
通常你会这样导入:
from . import want_to_be_run_elsewhere

这里不起作用,因为你调用的是 app.py。如果你导入 my_app.app,它就成为了模块的一部分。如果你直接调用它,它就不是。使用 从所在的模块导入它也不起作用。
你可以将 app.py 移动到 my_app 外面,从而将其从模块中移除,使导入重新起作用。
或者你可以使用
from __init__ import want_to_be_run_elsewhere

app.py文件中
我相信
from my_app import want_to_be_run_elsewhere

只有当您实际安装了pip install -e my_app/,它才能正常工作。然后它也应该可以工作。


或者,将 app.py 作为包中的模块调用:从 my_app 目录 上方 的目录中调用 python -m my_app.apppython3 -m my_app.app。请参见 https://dev59.com/HGgu5IYBdhLWcg3wJT9I#11536794。 - das-g
有趣!得试一下。 - Nils Werner
6
我会尽力为您翻译:我建议删除使用“from init import ...”的建议。这不是正确的做法。如果一些子模块中的代码依赖于包名称(例如,如果直接使用pickleshelve等模块),使用该解决方案甚至可能会破坏代码并使数据无法读取。 - Bakuriu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接