🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2452閲覧

while文のループからCtrl+Cで抜けられない。

shunsuke1937

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/03/17 10:19

以下のようにパソコンに接続をしたマイクから外部の音声を振幅に変更するプログラムを書きました。
イメージとしては、外部の音声を常に記録しつつ、特定の挙動が終了したのちに、whileループを抜け出し次の処理に移りたいと考えております。

python

1import matplotlib.pyplot as plt 2import numpy as np 3import pyaudio 4import sys 5from matplotlib import animation 6import matplotlib.pyplot as plt 7from IPython.display import HTML 8import pandas as pd 9%matplotlib 10 11fig = plt.figure 12CHUNK = 1024 13RATE = 44100 14list_x=[] 15list_y=[] 16xlim=[0,10] 17P = pyaudio.PyAudio() 18 19save_dir='C:/Users///' 20save_file='****' 21stream = P.open(format=pyaudio.paInt16, channels=1, rate=RATE, frames_per_buffer=CHUNK, input=True, output=False) 22 23while stream.is_active(): 24 try: 25 input = stream.read(CHUNK, exception_on_overflow=False) 26 27 28 ndarray_be = np.frombuffer(input, dtype='int16') 29 ndarray=ndarray_be/3276 30 31 y = [np.asscalar(i) for i in ndarray] 32 33 list_y.extend(y) 34 time=len(list_y) 35 x=range(time) 36 37 38 data1=list(x) 39 40 list_x=list(map(lambda k: k/1024,data1)) 41 if max(list_x)>10: 42 xlim[0]+=1 43 xlim[1]+=1 44 line,= plt.plot(list_x,list_y,color='red') 45 46 plt.pause(0.01) 47 48 plt.xlim(xlim[0],xlim[1]) 49 plt.ylim(-10,10) 50 line.remove() 51 52 53 54 55 #以下の処理は、ctrl+Cで抜けないので、確認用として入れております。 56      #ctrl+Cでループを抜けれるようであれば、この処理は無くします。 57 if max(list_x)>200: 58 gragh = {'x軸':list_x,'y軸':list_y} 59 graghPD = pd.DataFrame(gragh) 60 graghPD.to_csv('C:/Users////'+save_file+'.csv',encoding="shift_jis") 61 break 62 63 64 65 66 67 68 except KeyboardInterrupt: 69 break 70stream.stop_stream() 71stream.close() 72P.terminate() 73 74print('Stop Streaming')

しかし、例外処理として、以下のコードtryの例外処理としてexcep処理として追加することで、ctrl+Cで次の処理に移りたいのですが、
whileループを抜けることができないという状況です。

python

1except KeyboardInterrupt: 2 break

こちらに関して、ctrl+Cでwhileループを抜け出し、次の処理に移行させるには、どのように変更、修正を加えればよろしいでしょうか?コメントいただきたく。

よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2021/03/17 10:53

ソースを見るかぎり、Ctrl-Cでbreakするはずですが、実際Ctrl-Cを押すとどうなるのですか? 何も起きないとすると、そもそもCtrl-Cが送られていないかもしれません。
shunsuke1937

2021/03/17 11:22

コメントいただき、ありがとうございます。 Ctrl-Cを入力した際には、エラーも何もなく、ずっとグラフが更新され続けているだけとなっている状況です。確かに、コメントいただきました通り、Ctrl-Cが送られていない可能性を疑って見たいと思います。
hoshi-takanori

2021/03/17 15:31

そのスクリプトをどうやって動かしてるかによるのでは。
dodox86

2021/03/17 17:27 編集

ご提示のコードの一部に「save_dir='C:/Users///」があるところからWindows環境下での動作と推察しますが、Windowsで動くPythonにも動作環境含め、色々あるので、詳細を示した方が良いと思います。また、Windows下でCTRL+Cの扱いはLinux(UN*X)とは事情が異なるので、Stack Overflowの以下の質問回答がもしかしたら参考になるかもしれません。(CTRL+C押下時の挙動は質問者さんの場合と違うようですが) [Windows環境でPythonのシグナルを受け取れない - Stack Overflow 日本語版] https://ja.stackoverflow.com/questions/62459/windows%E7%92%B0%E5%A2%83%E3%81%A7python%E3%81%AE%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8C%E3%81%AA%E3%81%84 質問者 yurika氏 回答者 sayuri氏, kunif氏 ※ 上記、参照(引用)のルールに準じました - https://ja.stackoverflow.com/help/referencing
guest

回答1

0

イベントハンドラを作れば良いと思います。

投稿2021/03/17 10:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問