没有名为pathlib2的模块

时间:2018-06-01 03:51:26

标签: python json argparse google-assistant-sdk pathlib

我一直致力于让Google智能助理在我的Raspberry Pi 3上工作。 它正在运行,但我在解决这个具体步骤时遇到了问题: https://developers.google.com/assistant/sdk/guides/library/python/extend/handle-device-commands

此步骤包括向Pi发送开/关命令以打开或关闭LED灯泡。 我已经确认面包板和LED设置正确,因为我可以通过python脚本打开或关闭LED。

然而,按照该页面中的步骤并尝试运行以下命令" python hotword.py --device_model_id my-model" (实际上是:python hotword.py --device_model_id assistantraspi-1d671-pigooglev2-8n98u3) 我收到以下错误: ImportError:没有名为pathlib2的模块

我要包含该文件的副本(hotword.py)

#!/usr/bin/env python

# Copyright (C) 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


from __future__ import print_function

import argparse
import json
import os.path
import pathlib2 as pathlib
import RPi.GPIO as GPIO

import google.oauth2.credentials

from google.assistant.library import Assistant
from google.assistant.library.event import EventType
from google.assistant.library.file_helpers import existing_file
from google.assistant.library.device_helpers import register_device

try:
    FileNotFoundError
except NameError:
    FileNotFoundError = IOError


WARNING_NOT_REGISTERED = """
    This device is not registered. This means you will not be able to use
    Device Actions or see your device in Assistant Settings. In order to
    register this device follow instructions at:

    https://developers.google.com/assistant/sdk/guides/library/python/embed/register-device
"""


def process_event(event):
    """Pretty prints events.

    Prints all events that occur with two spaces between each new
    conversation and a single space between turns of a conversation.

    Args:
        event(event.Event): The current event to process.
    """
    if event.type == EventType.ON_CONVERSATION_TURN_STARTED:
        print()

    print(event)

    if (event.type == EventType.ON_CONVERSATION_TURN_FINISHED and
            event.args and not event.args['with_follow_on_turn']):
        print()
    if event.type == EventType.ON_DEVICE_ACTION:
        for command, params in event.actions:
            print('Do command', command, 'with params', str(params))
            if command == "action.devices.commands.OnOff":
                if params['on']:
                    print('Turning the LED on.')
                    GPIO.output(25, 1)
                else:
                    print('Turning the LED off.')
                    GPIO.output(25, 0)

def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument('--device-model-id', '--device_model_id', type=str,
                        metavar='DEVICE_MODEL_ID', required=False,
                        help='the device model ID registered with Google')
    parser.add_argument('--project-id', '--project_id', type=str,
                        metavar='PROJECT_ID', required=False,
                        help='the project ID used to register this device')
    parser.add_argument('--device-config', type=str,
                        metavar='DEVICE_CONFIG_FILE',
                        default=os.path.join(
                            os.path.expanduser('~/.config'),
                            'googlesamples-assistant',
                            'device_config_library.json'
                        ),
                        help='path to store and read device configuration')
    parser.add_argument('--credentials', type=existing_file,
                        metavar='OAUTH2_CREDENTIALS_FILE',
                        default=os.path.join(
                            os.path.expanduser('~/.config'),
                            'google-oauthlib-tool',
                            'credentials.json'
                        ),
                        help='path to store and read OAuth2 credentials')
    parser.add_argument('-v', '--version', action='version',
                        version='%(prog)s ' + Assistant.__version_str__())

    args = parser.parse_args()
    with open(args.credentials, 'r') as f:
        credentials = google.oauth2.credentials.Credentials(token=None,
                                                            **json.load(f))

    device_model_id = None
    last_device_id = None
    try:
        with open(args.device_config) as f:
            device_config = json.load(f)
            device_model_id = device_config['model_id']
            last_device_id = device_config.get('last_device_id', None)
    except FileNotFoundError:
        pass

    if not args.device_model_id and not device_model_id:
        raise Exception('Missing --device-model-id option')

    # Re-register if "device_model_id" is given by the user and it differs
    # from what we previously registered with.
    should_register = (
        args.device_model_id and args.device_model_id != device_model_id)

    device_model_id = args.device_model_id or device_model_id

    with Assistant(credentials, device_model_id) as assistant:
        events = assistant.start()

        device_id = assistant.device_id
        print('device_model_id:', device_model_id)
        print('device_id:', device_id + '\n')
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)

        # Re-register if "device_id" is different from the last "device_id":
        if should_register or (device_id != last_device_id):
            if args.project_id:
                register_device(args.project_id, credentials,
                                device_model_id, device_id)
                pathlib.Path(os.path.dirname(args.device_config)).mkdir(
                    exist_ok=True)
                with open(args.device_config, 'w') as f:
                    json.dump({
                        'last_device_id': device_id,
                        'model_id': device_model_id,
                    }, f)
            else:
                print(WARNING_NOT_REGISTERED)

        for event in events:
            process_event(event)


if __name__ == '__main__':
    main()

4 个答案:

答案 0 :(得分:1)

您是否尝试使用pathlib2pip安装pip3?请尝试

pip install pathlib2

如果你使用的是Python2,那么

pip3 install pathlib2

如果您使用的是Python3。但是,如果找不到pip,请尝试使用

进行安装
apt-get install python-pip python3-pip

答案 1 :(得分:1)

感谢您的建议。事实证明解决方案非常简单。

解决方案有两个方面: 1:我必须先运行以下命令:

source env/bin/activate

然后我可以运行python脚本而不会出现错误

(env) pi@raspberrypi:~/assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/library $ python hotword.py --device_model_id assistantraspi-1d671-pigooglev2-8n98u3

随着文章的进展,源本身将被停用并返回正常提示,首先以(env)开头。
试图在没有先加载源命令的情况下运行python脚本就是问题所在。

我仍然无法理解这一切是如何运作的,但我会继续保持畅通并希望了解这个命令首先运行的是什么

source env/bin/activate

答案 2 :(得分:0)

这是脚本使用的命令。

public class SquareManager extends SimpleViewManager<View> {
    public static final String REACT_CLASS = "Square";

    private View view;
    private TextView textView;

    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Override
    protected View createViewInstance(ThemedReactContext reactContext) {
        view = new View(reactContext);
        view.setBackgroundColor(Color.BLUE);
        textView = new TextView(reactContext);
        // view.addView(textView); // <-- This does not work, addView not being a method of View
        return view;
    }

    @ReactProp(name = "text")
    public void setTextProp(View view, String prop) {
        // view.setText(prop); // <-- this does not work as I cannot setText on a View
    } 
}

答案 3 :(得分:0)

确保您在虚拟环境中工作。

如果没有进入虚拟环境并尝试。

如果仍然遇到问题,请在虚拟环境中执行以下命令,然后重试:

sudo pip3 install pathlib2

这对我有用