在Google App Engine中导入自定义模块

0 投票
3 回答
1982 浏览
提问于 2025-04-16 02:25

我刚开始接触Google App Engine,最近在玩这个东西,但我实在搞不懂怎么导入一些非标准的模块,而且也不太明白app.yaml文件的作用。

简单来说,我想从我的脚本文件中导入SimPy(大约有15个Python文件),但是我尝试的各种方法都导致了ImportError,也就是导入错误,比如:

from SimPy.Simulation import *
ImportError: No module named SimPy.Simulation

目前这些文件都在同一个文件夹里,而我的app.yaml文件内容是:

application: physicalsim
version: 1
runtime: python
api_version: 1

handlers:
- url: /
  script: physicalsim.py
- url: /
  script: Globals.py
- url: /
  script: Simulation.py
etc....

我现在很确定我的yaml文件语法写错了,但我找不到任何有用的文档来指导我怎么做(这让我有点沮丧),而且我也不太理解我看到的一些app.yaml文件中定义的文件夹的意思,考虑到没有实际的文件结构,它们只是虚拟文件夹吗?

如果你能帮忙我会很感激,我知道我可能看起来有点傻 :)

3 个回答

1

在你想要导入模块的任何子文件夹里,添加一个空的 init.py 文件。我之前并不知道这一点...

我是在这个 Stack Overflow 的帖子里找到答案的。

从子文件夹导入模块

1

关于app.yaml文件的说明可以在这个应用配置页面找到。

在处理程序部分,主要是通过比较请求的URL和每个指定的模式来工作。当找到第一个匹配时,就会运行对应的处理程序(或者如果指定了static_dirstatic_files,就会提供静态文件,而不是运行script)。

在你展示的app.yaml中,URL完全匹配/时,会调用处理程序physicalsim.py。其他的处理程序会被忽略,因为它们都是从同一个URL提供的。如果那些是physicalsim.py的支持模块,你就不需要在app.yaml中提到它们。

URL的结构不一定要和你的网站内部结构相对应。URL路径和包含处理程序及模块的目录之间不需要有任何对应关系(不过为了清晰起见,你可能还是想保持一些关联)。

你有没有看过入门文档

包含app.yaml的目录(也就是你将要上传的应用的根目录)会在Python路径上,你应该能够根据这个路径引用所有模块(如果需要的话,也可以在你的处理程序中添加其他模块)。

3

来自appconfig(跳过文件)的文档:

在你的应用程序目录中,路径与静态目录(static_dir)或静态文件上传路径(static_files upload path)匹配的文件被认为是静态文件。其他所有文件都被视为应用程序程序和数据文件

skip_files元素指定了哪些文件在应用程序目录中不应该被上传到App Engine。这个值可以是一个正则表达式,或者是一个正则表达式的列表。任何与这些正则表达式匹配的文件名在上传应用程序时都会被排除在上传文件列表之外。

(不要把SimPy放在跳过列表中)。

app.yaml中不需要指定包含的程序文件。确保你的应用程序目录中有一个名为SimPy的子目录,并且里面有一个__init__.py文件,当然,还有Simulation.py

撰写回答