Python 3でraw_inputを使用する方法


553
import sys
print(sys.platform)
print(2**100)
raw_input()

Python 3.1を使用していますがraw_input、DOSポップアップを「フリーズ」できません。私が読んでいる本はPython 2.5用で、Python 3.1を使用しています

これを修正するにはどうすればよいですか?


1
ええと、NameErrorが発生します。コードを使用しようとしたときに、名前「raw_input」が定義されていません。同じじゃないの?
SilentGhost 2009年


9
Python 3では多くの点が変更されているため、2.5の本(これは本当に古い)を使用して習得するべきではありません。
Niklas B.

5
raw_inputはpython 3のinputに名前が変更されました
クリスタンは

Oauth2リンクをたどるとhttp 401エラーが発生する
Big Ian

回答:


1011

Python 3から、raw_input()に名前が変更されましたinput()

以下からの新機能ではPython 3.0、組み込み関数セクション 2番目の項目。


56
もともと、現在のeval(input())のように機能する関数input()がありました。Pythonのセキュリティ意識が低くなったときの残り物でした。この変更により言語が簡素化されました。詳細な説明については、「これをインポートする」も参照してください。進化した言語よりも死んだ言語を好みますか?周辺にはたくさんあります。
meawoppl 2014

9
私は同様のpythonを学ぶとの違いの1つを見つけたんだinput()raw_input()a = input()ユーザー入力を受け取り、正しいタイプに入れます。例:ユーザーが5 と入力した場合、inの値aは整数5です。 a = raw_input()ユーザー入力を受け取り、文字列として配置します。例:ユーザーが5と入力した場合、の値aは文字列「5」であり、整数ではありません。私のようなpythonの初心者にとっては良い情報かもしれません。
Vishnu Narang 2016年

10
@VishnuNarangええ、そうです。Python2では正しいですが、Python 3ではこの動作が変更され、入力はPython 2でraw_inputが行ったことと同じです
balpha

4
@balpha:検証されました。あなたは正しいです。私はpython 2.7を持っています(答えを編集してそれを言及することはできません...)
Vishnu Narang

3
@meawoppl python 2から3への移行は、破壊的なものでした。それがそうでなければならなかったという意味ではありません。言語は死ぬことなく、関数のシグネチャを変更することなく進化できます。グローバル機能がない場合に役立ちます。他の言語からのいくつかの後知恵から始めます。機能の削除なども考慮されていません。
dlamblin 2017

117

これはPython 3.xおよび2.xで機能します。

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))

4
私はなっていたスコープの問題を、このアプローチで。global input呼び出し関数の上部にa を付けて修正しました。
kevlar1818

1
これは私には少しきれいにimport __builtin__; input = getattr(__builtin__, 'raw_input', input)
思え

3
Python 3にはという名前のモジュールはありません__builtin__
Cees Timmerman、2013年

@mbarkhau:グローバルすぎます。それを期待しないライブラリを呼び出すとどうなりますか?Python 3ではに__builtin__名前が変更されbuiltinsました。どちらも__builtins__CPythonと同様に使用できます。
jfs 2014年

3
getattr(__builtins__, 'raw_input', input)Python 2.7.2にインポートすると、デフォルトを返します。
Cees Timmerman、2014年

45

これに対処する信頼できる方法は

from six.moves import input

6は2/3の一般的なコードベースの問題点の多くにパッチを当てるモジュールです。


1
良い考え...そして、もしそうならfrom six.moves import input as raw_input、あなたはraw_inputあなたのスクリプトを保ち、両方のPythonバージョンを使って実行することができます。
eddy85br

15

他の人が示したように、このraw_input関数はinputPython 3.0で名前が変更されており、より最新の本を提供するほうがよいでしょうが、スクリプトの出力を確認するためのより良い方法があることを指摘したいと思います。 。

あなたの説明から、私はあなたがWindowsを使用していると思います、あなたは.pyファイルを保存し、それをダブルクリックして実行します。プログラムが終了するとすぐにポップアップするターミナルウィンドウが閉じるため、プログラムの結果を確認することはできません。この問題を解決するには、ユーザーがEnterキーを押すまで待機するraw_input/ inputステートメントを追加することをお勧めします。ただし、これまでに説明したように、プログラムのエラーなどの問題が発生した場合、そのステートメントは実行されず、何が問題かを確認できずにウィンドウが閉じます。コマンドプロンプトまたはIDLEを使用する方が簡単な場合があります。

コマンドプロンプトを使用する

Pythonプログラムを含むフォルダーウィンドウを表示しているときに、Shiftキーを押しながら、ウィンドウの白い背景領域の任意の場所を右クリックします。ポップアップメニューには、「コマンドウィンドウをここに開く」というエントリが含まれている必要があります。(これはWindows VistaおよびWindows 7で機能すると思います。)これにより、次のようなコマンドプロンプトウィンドウが開きます。

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

    C:\Users\Weeble\My Python Program>_

プログラムを実行するには、次のように入力します(スクリプト名に置き換えます)。

    python myscript.py

... Enterキーを押します。(「python」が認識されないコマンドであるというエラーが発生した場合は、http://showmedo.com/videotutorials/video? name=960000&fromSeriesID=96を参照してください)プログラムが正常に完了するかどうかに関係なく、プログラムの実行が完了すると、ウィンドウは開いたままで、コマンドプロンプトが再び表示され、別のコマンドを入力できます。プログラムを再度実行する場合は、上向き矢印を押して前に入力したコマンドを呼び出し、Enterキーを押してもう一度実行することができます。毎回ファイル名を入力する必要はありません。

IDLEを使用する

IDLEは、Pythonとともにインストールされるシンプルなプログラムエディターです。他の機能の中でも、ウィンドウでプログラムを実行できます。.pyファイルを右クリックし、[ IDLEで編集] を選択します。プログラムがエディターに表示されたら、F5キーを押すか、[実行]メニューから[モジュールの実行]を選択します。プログラムは、プログラムの終了後も開いたままのウィンドウで実行されます。このウィンドウでは、Pythonコマンドを入力してすぐに実行できます。


IDLEはWindowsと共にインストールされますか?端末でIDLEまたはアイドルを実行すると、空になります。
vgoff 2013

1
IDLEはWindows上のPythonとともにインストールされます。これはスタートメニューのショートカットとして、また.pyファイルのファイルの関連付けとして表示されますが、デフォルトではパスに「アイドル」コマンドが追加されているとは思いません。コマンドラインから起動する場合は、次のコマンドを実行できますpythonw -m idlelib.idle
Weeble

なるほどね。私はOSとしてではなく、お金を稼ぐためにWindowsに触れるだけです。次に、「IDLEを使用する」セクションは偏っていると言えます。おそらく、選択性について言及する必要があります。
vgoff 2013

3
私は上手く理解できていない気がします。問題はWindows固有のものでした。「DOSポップアップ」について話します。IDLEはPythonの一部としてインストールされますが、一部のディストリビューターはそれを分離する場合があります。たとえば、Ubuntuでは、別のパッケージとしてインストールする必要があるようです。答えはすでに質問者が求めたものとは異なるアプローチを示唆しているので、私はそれ以上の正接を追加したくない。FWIW私は自宅でLinuxを使用しており、仕事のためにWindowsのみを使用しています。
Weeble 2013

DOSは、1981年から1995年、または部分的にDOSベースのMicrosoft Windowsバージョン95、98、およびMillennium Editionを含む約2000年までIBM PC互換市場を支配していたいくつかの密接に関連するオペレーティングシステムの頭字語です。
vgoff 2013

7

Timmermanのソリューションはコードの実行Undefined name時にうまく機能しますが、pyflakesまたは同様のリンターを使用しているときにエラーが発生したくない場合は、代わりに以下を使用できます。

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass

ええ、私はまだpylintのエラーの多くを取得しています:Redefining built-in 'input' (redefined-builtin)Unable to import '__builtin__' (import-error)Invalid constant name "input" (invalid-name)
Babken Vardanyan 2014

@BabkenVardanyan pylintは、コードスタイルに関しては非常に厳密です。私がお勧めでしょうflake8pyflakes無意味な警告がすべてのあなたの一日取らないように。
jmagnusson 2014

6

以下は、py2 / 3-agnostic環境で実行したくないスクリプトに追加したコードの一部です。

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

これで、real_raw_inputを使用できます。かなり高価ですが、短くて読みやすいです。生の入力を使用すると、通常は時間がかかる(入力を待つ)ため、重要ではありません。

理論的には、real_raw_inputの代わりにraw_inputを割り当てることもできますが、raw_inputの存在を確認し、それに応じて動作するモジュールが存在する場合があります。安全側に留まる方が良いでしょう。


試したときにこれが表示されます:inputcons = vars(builtins).get( 'raw_input'、input)TypeError:vars()引数にはdict属性が必要です

0

おそらく最善の解決策ではありませんが、ここに来る前に、すぐに勉強を中断することなく作業を続けるためにこれをオンザフライで作成しました。

def raw_input(x):
  input(x)

次に、raw_input('Enter your first name: ')作業中のスクリプトを実行すると、スクリプトがキャプチャされinput()ます。

私がまだ出会っていないので、これをしない理由があるかもしれません!


7
なぜraw_input = inputですか?
tonypdmtr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.