【问题标题】:Error parsing yaml file: mapping values are not allowed here解析 yaml 文件时出错:此处不允许映射值
【发布时间】:2024-01-20 15:45:01
【问题描述】:

我想将应用上传到 Google App Engine:

我明白了

Error parsing yaml file:
mapping values are not allowed here
  in "/home/antonio/Desktop/ATI/climate-change/app.yaml", line 2, column 8 

运行时

./appcfg.py update /home/antonio/Desktop/ATI/climate-change

使用此 app.yaml 文件:

application:climate-change
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: helloworld.app

第 2 行,第 8 列对应于版本行。这里有什么问题?顺便说一句,我在这里使用的是 Ubuntu 12.04。

【问题讨论】:

  • 确保您没有从 Skype 或某些软件复制文本。首先将文本粘贴到文本编辑器中,然后从那里复制。我从 Skype 复制,显然没有问题。我通过简单地删除然后重新输入“空格”来创建有效的(Unix)空格来解决它。

标签: google-app-engine yaml


【解决方案1】:

在我们的例子中,由于复制和粘贴,我们有奇怪的破折号 () 而不是普通的破折号 (-)。

【讨论】:

    【解决方案2】:

    正如大多数人所提到的,yaml 文件中有几个问题,yaml 文件通常很难识别问题,

    幸运的是,它可以使用 yaml lint 等工具轻松识别,您可能不需要社区的帮助。

    安装它

    npm install -g yaml-lint
    

    您可以通过以下方式进行验证

    E:\githubRepos\prometheus-sql-exporter-usage>yamllint docker-compose.yaml
    √ YAML Lint successful.
    

    【讨论】:

      【解决方案3】:

      改变

      application:climate-change
      

      application: climate-change
      

      如果你想要一个键值对,冒号后面的空格在 yaml 中是强制性的。 (见http://www.yaml.org/spec/1.2/spec.html#id2759963

      【讨论】:

        【解决方案4】:

        不正确:

        people:
          empId: 123
          empName: John
            empDept: IT
        

        正确:

        people:
          emp:
            id: 123
            name: John
            dept: IT
        

        【讨论】:

          【解决方案5】:

          我的问题是缺少一组引号;

          Foo: bar 'baz'
          

          应该是

          Foo: "bar 'baz'"
          

          【讨论】:

            【解决方案6】:

            我在乔的回答中提到的类似情况下看到了这个错误:

            description: Too high 5xx responses rate: {{ .Value }} > 0.05
            

            我们在描述值中有一个冒号。因此,问题在于描述值周围缺少引号。可以通过加引号来解决:

            description: 'Too high 5xx responses rate: {{ .Value }} > 0.05'
            

            【讨论】:

              【解决方案7】:

              另一个原因是错误的缩进,这意味着试图创建错误的对象。我刚刚在 Kubernetes Ingress 定义中修复了一个:

              错误

              - path: / 
                  backend: 
                    serviceName: <service_name> 
                    servicePort: <port> 
              

              正确

              - path: /
                backend:
                  serviceName: <service_name>
                  servicePort: <port>
              

              【讨论】:

              • 是的,这也是我的问题。这就是为什么 python 非常愚蠢的原因。空格不应该很重要。
              • 不知道这是一个 python 文件。我有一个额外的空间。疯狂的。谢谢你的回答!
              • 它不是 Python 文件。 YAML 和 Python 的相似之处在于它们都使用“承载空格”来减少您原本需要的标点符号数量。
              • @shacker 我宁愿有标点符号。
              • @mal 好消息是 yaml 是 json 的超集。所以,[{"path": "/", "backend": {"serviceName": "&lt;service_name&gt;", "servicePort": "&lt;port&gt;"}}] 也是有效的 yaml :)
              【解决方案8】:

              也许这会对其他人有所帮助,但是当映射的 RHS 包含冒号而没有括起来引号时,我已经看到此错误,例如:

              一些键: 另一个关键:今天要做出的改变:锻炼更多

              应该是

              一些键: 另一个关键:“今天要做的改变:锻炼更多”

              【讨论】:

                【解决方案9】:

                或者,如果间距不是问题,它可能需要父目录名而不是文件名。

                不是$ dev_appserver helloapp.py
                而是$ dev_appserver hello/

                例如:

                Johns-Mac:hello john$ dev_appserver.py helloworld.py
                Traceback (most recent call last):
                  File "/usr/local/bin/dev_appserver.py", line 82, in <module>
                    _run_file(__file__, globals())
                ...
                  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/yaml_listener.py", line 212, in _GenerateEventParameters
                    raise yaml_errors.EventListenerYAMLError(e)
                google.appengine.api.yaml_errors.EventListenerYAMLError: mapping values are not allowed here
                  in "helloworld.py", line 3, column 39
                

                对比

                Johns-Mac:hello john$ cd ..
                Johns-Mac:fbm john$ dev_appserver.py hello/
                INFO     2014-09-15 11:44:27,828 api_server.py:171] Starting API server at: http://localhost:61049
                INFO     2014-09-15 11:44:27,831 dispatcher.py:183] Starting module "default" running at: http://localhost:8080
                

                【讨论】: