我尝试将以下行添加到我的处理程序脚本(main.py)中,但它似乎不起作用:
sys.path.append( '子目录')
subdir
位于我的根目录(即包含app.yaml
的目录)中。
这似乎不起作用,因为当我尝试导入subdir
中的模块时,我的应用会爆炸。
答案 0 :(得分:19)
1)确保__init__.py
中有一个空白subdir
文件。
2)使用完整路径;像这样的东西:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
编辑:提供更多信息以回答评论中提出的问题。
As Nick Johnson demonstrates您可以将这三行代码放在名为fix_path.py
的文件中。然后,在main.py
文件中,在执行所有其他导入之前执行此操作import fix_path
。 Link to a tested application using this technique。
而且,是的,__init__.py
文件是必需的;根据{{3}}:
导入包时,Python 搜索目录 sys.path寻找包 子目录。
需要
__init__.py
个文件 让Python将目录视为 包含包;这是完成的 防止具有共同的目录 名称,例如字符串,来自 无意中隐藏了有效的模块 稍后在模块搜索中发生 路径。在最简单的情况下,__init__.py
可以只是一个空文件,但它也可以执行初始化 包的代码或设置__all__
变量,稍后描述。
答案 1 :(得分:2)
我可以将新目录作为sys.path中的第一个条目插入。
path_changer.py:
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'libs'))
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'apps'))
app.py:
import path_changer
from google.appengine.ext.webapp.util import run_wsgi_app
from flask import Flask
import settings
app = Flask('myapp')
app.config.from_object('settings')
from website import views as website_views
run_wsgi_app(app)