質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

Raspberry piで天気予報を読み上げたいです。pythonのエラーが出て実行できません。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,288

yumorian

score 8

前提・実現したいこと

Raspberry pi で、Pythonを使って天気予報を読み上げるプログラムを作成しています。
シェルスクリプトを完成させて、いざターミナルでスクリプトを実行させようとしたところ、以下のエラーメッセージが出て実行できませんでした。。

発生している問題・エラーメッセージ

Traceback (most recent call last);
 File "talk_weather.py", line 67, in <module> main()
 File "talk_weather.py", line 15, in main say_datetime()
 File "talk_weather.py", line 24, in say_datetime
 proc = sibprocess.Popen(shlex.split(text))
 File "/usr/lib/python2.7/subprocess.py", line 710, in__init__
  errread,errwrite)
 File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
  raise child_exception
OSError: [Error 2] No such file or directory

該当のソースコード

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shlex
import subprocess
from datetime import datetime
import urllib2
import json
CMD_SAY = 'jsay'
def main():
    say_datetime()
    say_weather()
    return
def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    text = CMD_SAY + ' ' + text
    print text
    proc = subprocess.Popen(shlex.split(text))
    proc.communicate()
    return
def say_weather():
    city = '130010'; # Tokyo 他の地域の方は、番号を変えてください。
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL
    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
    try:
        r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
        obj = json.loads( unicode(r.read()) )
        title = obj['title']
        forecasts = obj['forecasts']
        # TODAY
        cast = forecasts[0]
        temperature = cast['temperature']
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        today_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])
        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt
        weather_str = weather_str.encode('utf-8')
        text = '''%s '%s' ''' % (CMD_SAY, weather_str)
        print text
        proc = subprocess.Popen(shlex.split(text))
        proc.communicate()
    finally:
        r.close()
    return
### Execute
if __name__ == "__main__":
    main()

試したこと

下記のサイトを参考に自分で手入力によりtalk_weather.pyを作成しましたが、ダメでしたので、下記サイトの管理人の方がサーバーにあげているファイルをwgetしましたが、それでも同じエラーメッセージが出て失敗しました。

Linuxでは改行コードに気を配らなければならない点をネットで知りましたが、サイト管理人の方のファイルは改行コードに問題はないのではと考えたので、他に問題があるのではと思っております。

"/usr/lib/python2.7/subprocess.py"にファイルがないとあるので、usr/lib/python2.7の中にsubprocess.pyがないので怒られているのかと思いましたが、きちんと存在していたので、何がエラーの原因か全くわからない状態です。

補足情報(言語/FW/ツール等のバージョンなど)

Raspberry piもプログラミングも初心者のため、以下のサイトを参考にさせていただいています。

http://raspi.seesaa.net/article/415530289.html

このサイトでいう、talk_weather.pyが完成し、python talk_weather.pyを実行しようとした際に上記のエラーが出ている状態です。

Raspberry piはPi2 Model Bです。
Open Jtalkとhts_engineはインストール済みで、指定した言葉を話してくれるところまでは昨日出来ました。

昨日Raspberry piを使い始めたばかりでして、こちらで質問するのも初めてです。表現など足りない点があるかもしれませんが、アドバイスをいただけると幸いです。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

お二方とも、ご回答ありがとうございました。
今試してみたのですが、動きました!

エラーの原因は、そもそもの実行自体をhomeから行っていたことでした(汗)
talk_weather.pyのある場所に移動してから実行すると、うまくいきました!
初心者の初歩的なミスですみません・・・ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/08 23:21

    カレントディレクトリの場所で結果が変わるということは PATH 環境変数の最初に . が含まれている( echo $PATH ってやると .:/usr/bin みたいになってる)ということでしょうか?もし、そうであれば、セキュリティ上の問題があってあまりおすすめできません。PATH環境変数から . を外して、CMS_SAY にフルパスでコマンドを指定することをおすすめします。
    まあ、負け惜しみですので、きにしなくてもかまいません。解決済みにしてください。

    キャンセル

0

18行目の

proc = subprocess.Popen(shlex.split(text))


でエラーになってると思われます。このときの Popen に渡してるコマンドはjsay 2016年3月21日10時23分14秒みたいな文字列です。しかし、この jsay コマンドが見つからないので、エラーになっているのではないでしょうか?
参考にされているサイトの最初に

事前に下記エントリーを参考に、open_jtalkを使った「jsay」コマンドを使えるようにしてください。

とありますが、これはOKですか? jsay コマンド単独では使えてますか?つまり、シェルのプロンプトからjsay 2016年3月21日10時23分14秒と打ち込んで正常に動作するでしょうか?

8行目に

CMD_SAY = 'jsay'

という行があって、これが実際に発音するときに呼び出すコマンドの名前になってます。
jsay ではなく、 jtalk.sh を呼び出したいのであれば、以下のように修正されてはいかがでしょうか?

CMD_SAY='/usr/local/bin/jtalk.sh

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/04 15:38

    ご回答ありがとうございます!
    jsayに関しては別のサイトを参考にして作成済みです。(http://jellyware.jp/kurage/raspi/raspi_speech_synthesis.html)この方と同じような手順で作成したので、私が作成したのはjsayではなく、jtalk.shというファイルになっております。$ jtalk.sh こんにちは 等で音声が出力されることも確認済です。


    jtalk.shの場所は/usr/local/bin/jtalk.shです。

    私はjtalk.shの書き方もhttp://jellyware.jp/kurage/raspi/raspi_speech_synthesis.htmlの書き方に沿ったのですが、jsayで実行されているhttp://raspi.seesaa.net/article/415530289.htmlの方の書き方と違うのが原因でしょうか...

    再びの質問になってしまい申し訳ありませんが、ご回答いただけますと幸いです!

    キャンセル

  • 2016/09/04 15:59

    今、念のためj同じ文法でjsayファイルを作成しまし、talk_weather.pyにもコマンドはjsayに設定しましたが、以下のエラーが発生しました。パイソンのバージョンの問題でしょうか。

    jsay9月4日15時58分
    Traceback (most recent call last):
    File "talk_weather.py", line 67, in <module>
    main()
    File "talk_weather.py", line 15, in main
    say_datetime()
    File "talk_weather.py", line 24, in say_datetime
    proc = subprocess.Popen(shlex.split(text))
    File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
    File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
    OSError: [Errno 2] No such file or directory

    キャンセル

  • 2016/09/05 14:28

    横からすみません。
    引用されているtalk_weather.pyなら、jsay9月4日15時58分とは表示されないと思います。
    ご自身で修正されていることと思いますが、
    shlex.split(text)で分割され、subprocess.Popenで起動できるようにしないと動かないと思います。
    jsay9月4日15時58分がコマンドと解釈され、そんなのないよと怒られているのではないでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる