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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

4167閲覧

PycharmのDebuggerのConsoleでのsys.stdin.read()の動きについて

evans

総合スコア48

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

1クリップ

投稿2016/09/17 14:58

###前提・実現したいこと
sys.stdin.read()で複数行のデータを読む際、Shift+F10(Run)で動作させた際のコンソール上では、
複数行入力後、Ctrl+Dで終了できるのですが、Shift+F9(Debug)で動作させた際のコンソール上では、
途中で改行を入力した時点で入力終了と判断してしまい、次のステップに進んでしまうため複数行入力ができません。

複数行入力したい場合にはどうすればよいのでしょうか?

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

・Runの場合
line 1 ←ここでEnterを押下しますがまだ入力できます
line 2
line 3
^D ←ここでCtrl+D押下により入力終了
'--------------------------------------------------
line 1
line 2
line 3


・Debugの場合
line 1 ←ここでEnterを押下した時点で次に進んでしまいます…
'--------------------------------------------------
line 1

###該当のソースコード

python

1import sys 2 3data = sys.stdin.read() 4 5print("-"*50) 6print(data)

###補足情報(言語/FW/ツール等のバージョンなど)
PyCharm Community Edition 2016.2
Build #PC-162.1237.1, built on July 20, 2016
JRE: 1.8.0_76-release-b216 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

Linux ubuntu 4.4.0-36-generic

Python 3.5.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

PyCharmユーザーです。Debugモードだと無理っぽいです。(参考に下に調査結果載せます)
どうもDebugモードだとPyCharmのコンソールはread()をreadline()として扱っているようです。
つまり一行で終わります。

全く解決にならないかもしれませんが(!)、通常起動時と同様のデータ入力方法にしたいのであればread()ではなく、readlines()を利用してはどうでしょうか?こちらであればデバッグ時も同様の動きをします。

python

1import sys 2 3data = sys.stdin.readlines() #入力をリスト型で返す 4 5print("-"*50) 6print("".join(data)) # dataはリスト型なので.joinで文字列に変換します

デバッグ実行結果

text

1Connected to pydev debugger (build 162.1967.10) 2pydev debugger: process 13760 is connecting 3 4line 1 5line 2 6line 3 7^D 8-------------------------------------------------- 9line 1 10line 2 11line 3 12Process finished with exit code 0

###[ご参考]調査など
pydevをトレースした所、pydev_console_utils.py(84)に下記のような記述があり、通常実行の複数行入力を厳密に再現していないと思われます。

python

1class BaseStdIn: 2# 中略 3 def read(self, *args, **kwargs): 4 #in the interactive interpreter, a read and a readline are the same. 5 return self.readline()

投稿2016/11/04 10:44

uni8inu

総合スコア127

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

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

evans

2016/11/13 15:21

uni8inu様 遅くなり申し訳ございません。ご回答ありがとうございます。 readlines()で完全に代替できる使い方をしていたので、 これからはreadlines()を使います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問