如何从Flask路径中导入包模块?

时间:2014-05-26 01:44:15

标签: python import flask package

我正在迁移我编写的标准Python包格式的应用程序。由于我的应用程序的模块分为几个目录,我曾经通过将它们各自的路径插入到sys.path中来导入它们,但这不再是一个选项,因为这些模块还从包内导入它们各自的依赖项。

我正在尝试从另一个文件中的Flask中的路径(@app.route)内加载一组模块。

@app.route("/interface")
def interface():
    moduleName = "Olympus.modules.%s.%s" % (category, module)
    print "Importing:", moduleName
    importedModule = __import__(moduleName)

(我已经删除了这个函数中的超常代码。)但是这个函数只产生了ImportErrors,告诉我“没有名为的模块”。每个(子)目录中都有__init__.py个文件,这些模块可以毫不费力地导入其他地方。从包含目录__init__.py导入模块会导致模块及其兄弟(例如,同一category中的所有脚本)都可以从脚本中访问,但这需要所有模块硬编码所有模块在init文件中。

路径位于Flask(http://flask.pocoo.org/docs/patterns/packages/)建议的单独文件中,该文件由应用程序的init文件导入。打印__name__时,会生成正确的打包名称。模块也可以单独导入文件的顶部,没有任何不良影响。 按照函数内的建议here打印pkgutils.itermodules会产生一个空列表。

我做错了什么?如何将这些模块导入Flask路径?

编辑:有问题的代码可以在这里找到:https://github.com/HAN-Olympus/Olympus/tree/master/webapp 编辑:这是目录结构,我已经修改了一些,但它仍然相当广泛。

.
├── Olympus
│   ├──__init__.py
│   ├── core
│   │   ├── Core.py
│   │   ├── __init__.py
│   │   ├── ModuleLoader.py
│   │   ├── Worker.py
│   ├── createMongoDatabase.js
│   ├── default.conf
│   ├── __init__.py
│   ├── lib
│   │   ├── Article.py
│   │   ├── Chemical.py
│   │   ├── Collection.py
│   │   ├── Config.py
│   │   ├── Controls.py
│   │   ├── Gene.py
│   │   ├── __init__.py
│   │   ├── ...
│   │   ├── TOXNETResult.py
│   ├── modules
│   │   ├── acquisition
│   │   │   ├── AcquisitionModule.py
│   │   │   ├── GeneOntology.py
│   │   │   ├── __init__.py
│   │   │   ├── PubMed.py
│   │   │   ├── TOXNET.py
│   │   │   ├── UniProt.py
│   │   │   ├── WormBase.py
│   │   ├── __init__.py
│   │   ├── interface
│   │   │   ├── __init__.py
│   │   │   ├── InterfaceModule.py
│   │   │   ├── LaTeX.py
│   │   │   ├── PlainHTML.py
│   │   │   ├── StyledHTML.py
│   │   ├── interpretation
│   │   │   ├── __init__.py
│   │   │   ├── InterpretationModule.py
│   │   │   ├── Sort.py
│   │   │   ├── Tail.py
│   │   └── visualization
│   │       ├── FancyTable.py
│   │       ├── __init__.py
│   │       ├── Table.py
│   │       ├── VisualizationModule.py
│   ├── olympus.conf
│   ├── README.md
│   ├── requirements.txt
│   └── webapp
│       ├── __init__.py
│       ├── routes.py
│       ├── start.py
│       ├── svglib.py
│       └── templates
│           ├── ...

1 个答案:

答案 0 :(得分:1)

将所有模块维护为标准模块

保持简单并安装模块以导入Flask环境。

完成所有模块(包括setup.py)

要使模块可安装,必须包含setup.py安装脚本。检查文档,如何执行此操作。

将模块安装到Flask app

从Flask app目录中,您可以通过以下方式安装其他模块:

$ pip install ../other_module_dir

并反复这样做。

以“编辑”模式安装模块

如果您想安装这些,使用最新版本,可以使用“编辑”安装模式

$ pip install -e ../other_module_dir

使用这种方法,如果您修改../other_module_dir项目中的代码,下次它将以更新版本导入。

使用requirements.txt

自动安装模块

要自动化安装,您最终可以将所有依赖项转储到名为requirements.txt的文件(通常)中:

$ pip freeze > requiremetns.txt

编辑它(删除,不属于那里,最后你可以一步安装所有相关模块:

$ pip install -r requirements.txt

结论

要求最高(但不是那么困难)的是使用setup.py完成模块。一旦你管理了这个(这个技能将在以后多次偿还),你的整个导入场景将变得微不足道,只需按照你导入的模块的名称并让它们可用(我建议使用绝对导入)。

注意:使用virtualenv进行此类工作,这不是必需的,但它会使您的工作更加简单。