无法在GAE本地开发环境上导入六个

时间:2018-12-18 06:17:48

标签: python google-app-engine google-cloud-platform

尝试运行我的GAE Python 2.7应用时遇到错误。

ImportError: No module named six

我已关注this页并按如下所示设置了app.yaml文件。

...
libraries:
  - name: six
    version: "1.9.0"
  - name: flask
    version:  "0.12"
  - name: jinja2
    version: "2.6"
  - name: pycrypto
    version: "2.6.1"
  - name: markupsafe
    version: "0.23"
  - name: werkzeug
    version: "0.11.10"
  - name: pytz
    version: "2017.3"

当我尝试导入flask程序包时,我首先遇到此错误。因此,我编写了一些调试代码来调查此问题,结果发现我也无法直接导入six

我打印了sys.path变量。

['C:\\Users\\user\\PycharmProjects\\gaeapp\\dist', 'C:\\Users\\user\\PycharmProjects\\gaeapp\\dist\\lib', 'C:\\Program Files (x86)\\Google\\google_appengine', 'C:\\Program Files (x86)\\Google\\google_appengine', 'C:\\Users\\user\\AppData\\Local\\conda\\conda\\envs\\py27-base\\DLLs', 'C:\\Users\\user\\AppData\\Local\\conda\\conda\\envs\\py27-base\\lib', 'C:\\Users\\user\\AppData\\Local\\conda\\conda\\envs\\py27-base', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\flask-0.12', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\jinja2-2.6', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\pycrypto-2.6.1', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\markupsafe-0.23', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\werkzeug-0.11.10', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\pytz-2017.3', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\six-1.9.0', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\click-6.6', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\itsdangerous-0.24', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\setuptools-0.6c11', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\protorpc-1.0', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\webapp2-2.3', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\webob-1.1.1', 'C:\\Program Files (x86)\\Google\\google_appengine\\lib\\yaml-3.10']

我还检查了 C:\ Program Files(x86)\ Google \ google_appengine \ lib \ six-1.9.0

我还尝试将six包直接导入python shell中,并且成功。

(py27-base) C:\>set PYTHONPATH=C:\Program Files (x86)\Google\google_appengine\lib\six-1.9.0

(py27-base) C:\>python
Python 2.7.15 |Anaconda, Inc.| (default, Nov 13 2018, 17:33:26) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import six
>>> six
<module 'six' from 'C:\Program Files (x86)\Google\google_appengine\lib\six-1.9.0\six\__init__.py'>
>>> exit()

所以我想知道是什么阻止了我的应用在 dev_appserver 环境中导入six

环境详细信息

  • Windows 10 64位,内部版本1809
  • Python 2.7.15 :: Anaconda,Inc。
  • GAE Python Standard SDK,版本1.9.80。 不是GCloud SDK

日志详细信息

2018-12-19 14:00:18 Running command: "['C:\\Users\\user\\AppData\\Local\\conda\\conda\\envs\\py27-base\\pythonw.exe', 'C:\\Program Files (x86)\\Google\\google_appengine\\dev_appserver.py', '--skip_sdk_update_check=yes', '--port=8080', '--admin_port=8000', 'C:\\Users\\user\\PycharmProjects\\gaeapp\\dist']"
INFO     2018-12-19 14:00:22,907 devappserver2.py:278] Skipping SDK update check.
INFO     2018-12-19 14:00:23,483 api_server.py:275] Starting API server at: http://localhost:54700
INFO     2018-12-19 14:00:23,493 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2018-12-19 14:00:23,497 admin_server.py:150] Starting admin server at: http://localhost:8000
INFO     2018-12-19 14:00:28,579 instance.py:294] Instance PID: 11908
INFO     2018-12-19 14:00:30,862 module.py:861] default: "GET / HTTP/1.1" 404 -
INFO     2018-12-19 14:00:35,223 module.py:434] [default] Detected file changes:
  blog\__init__.pyc
WARNING  2018-12-19 06:00:35,575 sandbox.py:1086] The module _winreg is whitelisted for local dev only. If your application relies on _winreg, it is likely that it will not function properly in production.

WARNING  2018-12-19 06:00:35,953 sandbox.py:1086] The module _ctypes is whitelisted for local dev only. If your application relies on _ctypes, it is likely that it will not function properly in production.

WARNING  2018-12-19 06:00:36,165 sandbox.py:1086] The module msvcrt is whitelisted for local dev only. If your application relies on msvcrt, it is likely that it will not function properly in production.

ERROR    2018-12-19 06:00:36,315 wsgi.py:263] 

Traceback (most recent call last):

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle

handler = _config_handle.add_wsgi_middleware(self._LoadHandler())

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler

handler, path, err = LoadObject(self._handler)

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject

obj = __import__(path[0])

  File "C:\Users\user\PycharmProjects\gaeapp\dist\blog\__init__.py", line 6, in <module>

from blog.resources import bloglist, blog, comment

  File "C:\Users\user\PycharmProjects\gaeapp\dist\blog\resources\__init__.py", line 7, in <module>

from flask_restful import fields

  File "C:\Users\user\PycharmProjects\gaeapp\dist\lib\flask_restful\fields.py", line 6, in <module>

import six

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\runtime\sandbox.py", line 1149, in load_module

raise ImportError('No module named %s' % fullname)

ImportError: No module named six

INFO     2018-12-19 14:00:36,362 module.py:861] default: "GET /blog/resources/blogs HTTP/1.1" 500 -
INFO     2018-12-19 14:00:41,301 instance.py:294] Instance PID: 19088
INFO     2018-12-19 14:00:41,301 module.py:434] [default] Detected file changes:
  blog

2 个答案:

答案 0 :(得分:0)

我的本​​地主机不存在生产中存在的随机库的问题(即osx上的pycrypto)

因此,除了为我所有的第三方库提供一个lib文件夹之外:https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27

我为这些有问题的库设置了名为localhost_libs的第二个文件夹

然后在我的appengine_config.py中,我有这个:

from google.appengine.ext import vendor
vendor.add('lib')

if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):
    vendor.add('localhost_libs')

答案 1 :(得分:0)

我已按照上面的描述创建了一个测试环境,但是在导入app.yaml文件中指定的模块时没有遇到问题。另一个可能的故障排除方法是创建一个演示应用程序,以便仔细检查GAE Launcher是否能够在dev_appserver环境中获取那些内置库。为此,请进入Google App Engine启动器,File > Add Demo Application > python > guestbook并编辑app.yamlguestbook.py文件以导入(例如)six模块并打印{ {1}}在“留言簿”页面中,您可以检查是否引发异常。

Alex提出的一种可能的解决方案是,将第三方库添加到var = six.__version__文件中,运行requirements.txt,然后创建一个相应的pip install -t lib -r requirements.txt文件,如this article中所述。不过请记住,仅将库导入“开发”环境中,问题仍可能会在生产环境中出现,在这种情况下,appengine_config.py文件为:

appengine_config.py

将是理想的(如Alex的回复中提供的文章所示)。

我还要补充一点,如果该项目还具有其他本地库(在追溯中似乎是这种情况),请确保在应用程序 中安装这些依赖项,如{{ 3}}。