如何在Google App Engine中修改sys.path(Python)?
我试着在我的处理脚本(main.py)里加了以下这一行,但好像没什么用:
sys.path.append('subdir')
subdir
这个文件夹在我的根目录下(也就是包含 app.yaml
的那个目录)。
这好像不管用,因为当我尝试导入在 subdir
里的模块时,我的应用就出错了。
2 个回答
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)
21
1) 确保在 subdir
文件夹里有一个空的 __init__.py
文件。
2) 使用完整的路径;像这样:
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'subdir'))
补充说明:提供更多信息以回答评论中的问题。
正如 Nick Johnson 所展示的,你可以把那三行代码放在一个叫 fix_path.py
的文件里。然后,在你的 main.py
文件中,在其他所有导入之前,先写 import fix_path
。这是一个使用这种方法的测试应用链接。
而且,确实需要 __init__.py
文件;根据 文档:
当导入这个包时,Python 会在
sys.path
指定的目录中查找这个包的子目录。
__init__.py
文件是必需的,它让 Python 把这些目录当作包含包的目录;这样做是为了防止一些常见名称的目录,比如 string,意外地隐藏掉后面在模块搜索路径中出现的有效模块。在最简单的情况下,__init__.py
可以只是一个空文件,但它也可以执行包的初始化代码或者设置后面会提到的__all__
变量。