AppEngine 服务器无法导入 atom 模块

3 投票
1 回答
1490 浏览
提问于 2025-04-15 12:44

我在我的ArchLinux上安装了gdata库,并且有一个简单的应用程序,它一开始就导入了atom库。当我运行gapp引擎并访问那个网页应用时,

$ python2.5 ./dev_appserver.py ~/myapp

它报错说'没有名为atom的模块'。但是当我在Python2.5的交互模式下运行'import atom'时,它是可以正常工作的。我该如何在我的GAppEngine应用程序中导入atom模块呢?

1 个回答

11

把 atom.py 文件放到你存放 GAE Python 源代码的同一个文件夹里,并确保在你上传应用时这个文件也被上传到服务器上。(上传是在你执行 appcfg.py update myapp/ 时进行的,除非你特别去阻止它;如果你想查看具体上传了什么,可以在命令中加上 --verbose 这个参数。)

(或者,如果文件比较大,可以把它打包成一个 zip 文件,然后在你的处理程序中把这个 zip 文件添加到 sys.path;具体可以参考 zipimport 的例子。)

这里假设你只有一个文件 atom.py,这是你要导入的文件;如果这个文件又导入了其他文件,你也需要用类似的方法把那些文件准备好,依此类推(可以查看 modulefinder,它在 Python 的标准库中,可以帮助你找到所有需要的模块)。

如果 atom 不是一个模块而是一个包,那么你在 import 时得到的是这个包目录下的 __init__.py 文件;所以同样的建议适用(而且 zipimport 更加方便,因为你可以很容易地把任何目录结构打包,比如用 Linux 命令行中的 zip -r 命令)。

如果在某个时刻(modulefinder 会帮助你发现)有依赖于第三方的 C 语言扩展(一个 .so.pyd 文件,Python 可以使用但不是用纯 Python 写的),而这个扩展不在 GAE 提供的短名单中(可以查看 这里),那么这段 Python 代码在 GAE 上就无法使用,因为 GAE 只支持纯 Python。如果是这种情况,你必须寻找在 GAE 上被支持的替代方案,也就是用纯 Python 的方法来实现你需要的功能。

撰写回答