【问题标题】:Import modules from parent folder with Flask使用 Flask 从父文件夹导入模块
【发布时间】:2015-03-16 23:36:50
【问题描述】:

我的文件夹树:

project/
    app/
        __init__.py
        models.py
        dir/test1.py
        dir/__init__.py
    run.py
    dir/test2.py
    dir/__init__.py

如果我想做一个

from app.models import Whatever

来自test1test2 唯一有效的方法是手动sys.path.append 类似

os.path.join(os.path.dirname(__file__), "../..")

但是有很多关于 SO 的答案说搞砸 sys.path 会给我带来麻烦(为什么?);可悲的是,经过 1 个多小时的谷歌搜索后,我仍然没有找到正确的导入方法,我真的很困惑。

【问题讨论】:

    标签: python flask python-import


    【解决方案1】:

    测试比不测试要好得多,所以如果您需要将路径附加到sys.path 以使其工作——在这个目录配置中,你会——这是一个合理而务实的步骤。

    但是,通常最好不要手动修改模块加载路径。它假定您的代码将始终加载到您的测试文件夹之外的目录中,这可能并不总是正确的。但是“你以后会遇到问题”是很弱的茶。

    更大的问题是您无法使用那个小路径补丁来完成您最终想要/需要的那种自动化测试和测试管理。更好的是学习使用真正的测试工具/测试运行器,例如pytestnose。如果您还使用诸如tox 之类的宏测试运行程序,那就更好了。该组合将自动将您的软件(包括任何声明的依赖项)安装在一个全新的原始virtual environment 中。这不仅可以帮助您测试模块的正常可操作性,还可以帮助您测试其可安装性。它还将帮助您轻松地在不同版本的 Python 上运行测试,而无需付出额外的努力。 (例如,我目前在 2.6、2.7、3.2、3.3、3.4、3.5 和几个版本的 PyPy 上进行测试——不是因为我使用了所有这些版本,而是因为它不需要我花费任何额外的成本确保我的软件运行在整个 Python 世界的大片区域。)

    公平警告:第一次设置测试环境有点困难,需要付出相当大的努力并学习“机械”技能。但这是一项一次性投资,将为您的所有 Python 工作带来红利。

    长话短说,修补sys.path 是一个公平的起点。但是您最终将需要更多的通用性、广度、深度、测试夹具和测试自动化——而路径修补无法帮助您解决这些问题。升级到真正的测试工具就可以了。

    【讨论】:

    • 感谢您的详细回答 :) 如果我不处理测试怎么办?例如。将app/helpFuncs/translate.pyapp/helpFuncs/convert.py 等一些帮助功能组合在一起感觉很自然,我可以从views.py 导入它们而不会弄乱主目录……在这种情况下我该怎么办?
    • 我添加了一个sample repository,概述了我将如何根据您想要的子文件夹结构排列文件。
    • 您真是太好了,谢谢!我暂时不会修补sys.path,但我会尝试重构我的应用程序以避免从内部模块导入外部模块......你的例子提醒我应该是相反的方式:)
    • 不要因为你发现这些模块导入和临时sys.path hacks 感到多么困惑而气馁。 Python 有很好的模块支持,但是有很多选项,通常是不兼容的,每个选项都有自己的细节。提示:找到你喜欢的结构的项目,然后模仿他们做事的方式。逐步学习如何从那里引入主题的变化。 “假装它,直到你成功为止。”
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多