Python 2.7 Google AppEngine dev_appserver引发ImportError,尽管该软件包安装在virtualenv中,并可在Google Cloud SDK中使用
我正在从事一个使用传统Python 2.7运行时的Google AppEngine项目——我的团队正在迁移,但我们目前仍在使用它。在过去的6个月里,本地开发对我来说运行良好,我的团队中没有其他人受到以下问题的影响 在启动Python 2.7 Google AppEngine dev_appserver引发ImportError,尽管该软件包安装在virtualenv中,并可在Google Cloud SDK中使用,python-2.7,google-app-engine,google-app-engine-python,Python 2.7,Google App Engine,Google App Engine Python,我正在从事一个使用传统Python 2.7运行时的Google AppEngine项目——我的团队正在迁移,但我们目前仍在使用它。在过去的6个月里,本地开发对我来说运行良好,我的团队中没有其他人受到以下问题的影响 在启动dev_appserver.py时,以及在处理任何请求时,我都会收到一个ImportError: 09:36:59 dev_server.1 | ERROR 2021-05-13 13:36:59,470 wsgi.py:269] 09:36:59 dev_serv
dev_appserver.py
时,以及在处理任何请求时,我都会收到一个ImportError
:
09:36:59 dev_server.1 | ERROR 2021-05-13 13:36:59,470 wsgi.py:269]
09:36:59 dev_server.1 | Traceback (most recent call last):
09:36:59 dev_server.1 | File "/Users/me/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 240, in Handle
09:36:59 dev_server.1 | handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
09:36:59 dev_server.1 | File "/Users/me/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 311, in _LoadHandler
09:36:59 dev_server.1 | handler, path, err = LoadObject(self._handler)
09:36:59 dev_server.1 | File "/Users/me/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 85, in LoadObject
09:36:59 dev_server.1 | obj = __import__(path[0])
09:36:59 dev_server.1 | File "/Users/me/Source/myproject/main.py", line 5, in <module>
09:36:59 dev_server.1 | import webapp2
09:36:59 dev_server.1 | File "/Users/me/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 25, in <module>
09:36:59 dev_server.1 | import webob
09:36:59 dev_server.1 | File "/private/var/folders/qs/2qn9hbhn3k77wbhgsg77w6tm0000gn/T/pip-target-etkWjd/lib/python/webob/__init__.py", line 1, in <module>
09:36:59 dev_server.1 | File "/Users/me/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/sandbox.py", line 1168, in load_module
09:36:59 dev_server.1 | raise ImportError('No module named %s' % fullname)
09:36:59 dev_server.1 | ImportError: No module named webob.datetime_utils
以及app.yaml
中规定的:
libraries:
...
- name: webob
version: "1.2.3"
...
我已确保在启动dev_appserver.py时我的virtualenv处于活动状态
对我来说,奇怪的是这一行回溯:
09:36:59 dev_server.1 | File "/private/var/folders/qs/2qn9hbhn3k77wbhgsg77w6tm0000gn/T/pip-target-etkWjd/lib/python/webob/__init__.py", line 1, in <module>
09:36:59 dev|server.1 | File”/private/var/folders/qs/2qn9hbhn3k77wbhgsg77w6tm0000gn/T/pip target etkWjd/lib/python/webob/uu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我不知道为什么要执行/private/var/folders
中的代码-它不应该调用我的virtualenv中的代码或Google Cloud SDK提供的代码吗
它似乎在SDK中-调用者是google cloud SDK/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py
,但是我找不到任何理由解释为什么webob
的解析路径在/private/var/folders
中,而不是我的virtualenv,或者更合理地说,webob-1.2.3
包也位于googlecloudsdk/platform/google\u appengine/lib/
中
事实上,在长达6年的Python全职开发中,我从未在回溯中看到过这样的文件路径——我总是希望执行的代码出现在我自己的文件或相关virtualenv的站点包中
此外,回溯中的文件不存在(或者至少我看不到):尝试ls
/private/var/folders/qs/2qn9hbhn3k77wbhgsg77w6tm0000gn/t/pip target etkWjd/
目录会导致没有此类文件或目录
我所尝试的:
完全删除并重新安装了我的virtualenv和Google Cloud SDK
删除了webob
的pip
安装实例
使用SDK(1.2.3)附带的相同版本重新安装了webob
使用pyenv
安装了一个新的python2.7实例,并使用它删除和重新创建我的virtualenv
从my路径中删除所有无关条目,以查看某个条目是否导致导入系统以意外方式解析webob
所有这些都不起作用。最终,我仍然不确定如果包安装在活动的virtualenv中,导入怎么会失败-我希望Google Cloud SDK中的webapp2
模块能够通过virtualenv解决导入问题,但我绝对不是导入系统的专家。在尝试导入webob
之前,我在/Users/me/google cloud sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py
中添加了以下代码:
import imp
fp, pathname, description = imp.find_module('webob')
print '--------------------------'
print fp
print pathname
print description
print '--------------------------'
其中:
14:03:13 dev_server.1 |--------------------------
14:03:13 dev_server.1 | None
14:03:13 dev_server.1 | /Users/me/Source/myproject/lib/webob
14:03:13 dev_server.1 | ('', '', 5)
14:03:13 dev_server.1 | --------------------------
lib
中的webob
目录是意外的-它包含在GAE上的python2运行时以及SDK中,因此不需要在lib
中出售。它也是空的,所以我没有注意到它,因为git
没有报告任何新的未跟踪文件
我不太清楚该机制,但这是导致导入问题的原因-我一删除空目录,问题就解决了。也许可以尝试从虚拟环境中卸载WebOb。GAE first gen希望使用自己的内部WebOb,因此在您的虚拟环境中出现WebOb可能会令人困惑。@gaefan感谢您的关注!我也有同样的想法,但不幸的是这没有帮助。为了更好的衡量,我刚刚用我的新virtualenv再次尝试,但结果是一样的。我已经验证了内部WebOb是否存在于SDK文件夹中,因此我不确定为什么在导入过程中,sandbox.py
无法找到它。
14:03:13 dev_server.1 |--------------------------
14:03:13 dev_server.1 | None
14:03:13 dev_server.1 | /Users/me/Source/myproject/lib/webob
14:03:13 dev_server.1 | ('', '', 5)
14:03:13 dev_server.1 | --------------------------