我正在迁移我编写的标准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
│ ├── ...
答案 0 :(得分:1)
保持简单并安装模块以导入Flask环境。
要使模块可安装,必须包含setup.py
安装脚本。检查文档,如何执行此操作。
从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进行此类工作,这不是必需的,但它会使您的工作更加简单。