48147


Python3.6.2で以下の `input()` がエラーになります。

原因と修正方法をお教えください。

**実行環境:**  
Windows 10  
Python 3.6.5  
(Anaconda3-5.2.0-Windows-x86_64.exeでインストールしました)

[code]

    E:\work\python\lesson>python
    Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
    
[/code]

test_inpStr.py をコマンドプロンプトから実行すると以下のエラーとなります。  
何故でしょうか？

**test_inpStr.py**

[code]

    #! python3                    
    # -*-coding:utf-8-*-          
    print("文字を入力してみよう。") 
    x=input()                     
    print(x,"が入力されたよ。")
    
[/code]

**実行時のエラーメッセージ:**

[code]

    E:\work\python\lesson>test_inpStr.py
    文字を入力してみよう。
    aaa
    Traceback (most recent call last):
      File "E:\work\python\lesson\test_inpStr.py", line 5, in ?
        x=input()
      File "<string>", line 0, in ?
    NameError: name 'aaa' is not defined
    
[/code]


CC BY-SA 4.0
2018-09-06T08:38:08.910
48146
2021-12-24T00:45:24.903
2021-12-24T00:45:24.903
3060
30007
question
python python3 windows
コマンドプロンプトから Python 3.6 スクリプトの実行時、input() でエラーになってしまう


## `x=input()` でのエラーについて

予想と反し、実際には Python 2 で実行していることが原因だと思われます。`python <ファイル名>` で実行するようにしてください。

コマンドプロンプト (cmd.exe) において `.py` で終わるファイル名のみを打ち込んだ場合、拡張子 `.py`
に関連付けられたアプリケーションによってそのファイルが開かれます。今回の場合、コマンドプロンプトへ単に `test_inpStr.py`
と打ち込んでいるため、関連付けられたアプリケーションによってスクリプトが解釈されています。出ているエラーから判断するに
(※1)、おそらく以前どこかのタイミングで `.py` に Python 2 を関連付けており、Python 2 によってスクリプトが解釈されたのでしょう
(※2)。

※1：[Python 3 と 2 では `input()`
の挙動が異なり](https://docs.python.org/ja/3/whatsnew/3.0.html#builtins)、Python 2
における `input()` は入力を式として評価してしまうため、今回の NameError が出ます。

※2：[Shebang](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_\(Unix\))
についてご存じであれば、「スクリプトファイル 1 行目の `#! python3` によって Python 3
になるのではないの？」と思うかもしれません。しかし shebang は主に UNIX 系のシェルにおける慣習であり、cmd.exe
から直接実行する場合は意味がありません。Windows では[Python
ランチャーを使っている場合に使われます](http://d.hatena.ne.jp/yohhoy/20150320/p1)。

ファイルの関連付けを Python 3 へ変更したい場合、metropolis
さんが[コメント](https://ja.stackoverflow.com/questions/48146/pyton3-6%E3%81%A7-input%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99/48147#comment49750_48146)なさった
[How to execute Python scripts in
Windows?](https://stackoverflow.com/a/1936078) をご覧ください。また本当に Python 2
で実行されているのか確かめたい場合、PicoSushi
さんが[コメント](https://ja.stackoverflow.com/questions/48146/pyton3-6%E3%81%A7-input%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99/48147#comment49751_48146)なさっているように
[`import sys;
print(sys.version)`](https://docs.python.jp/3/library/sys.html#sys.version)
と書かれたスクリプトを実行するとバージョンが出力されます。

## Unicode error について

以下を確認してください。

  * スクリプトファイルが utf-8 という文字コードで保存されているか。
  * スクリプトに全角スペースが混じっていないか。


CC BY-SA 4.0
2018-09-06T09:35:20.887
48147
2018-09-06T09:52:33.033
2018-09-06T09:52:33.033
19110
19110
48146
answer


## 解決しました

ご指摘の稼動しているpythonのバージョンを確認しました。  

[code]

    E:\work\python\lesson>ftype Python.File
    Python.File="C:\Python24\\python.exe" "%1" %*
[/code]

本来使いたいのは3.6ですので，コマンドプロンプト(管理者権限)でパスを通しました。  
  
●管理者:コマンドプロンプト

[code]

    C:\windows\system32>ftype Python.File="C:\Anaconda3\python.exe" "%1" %*
    Python.File="C:\Anaconda3\python.exe" "%1" %*
[/code]

●コマンドプロンプト

[code]

    E:\work\python\lesson>ftype Python.File
    Python.File="C:\Anaconda3\python.exe" "%1" %*
[/code]

※パスを通す前に行ったこと([pythonランチャー](https://docs.python.jp/3/using/windows.html)で見つけた設定)  
- PATHEXT環境変数の拡張子リストに.PY;.PYWを追加  
- MAX_PATH の制限を除去  
(ここでは不要だったかもしれません。)

1回エラーになり，test_inpStr.pyのエンコードを確認(shift-JISでした)，utf-8にしたところ，正常に動きました。

[code]

    E:\work\python\lesson>test_inpStr.py
    文字を入力してみよう。
    aaa
    aaa が入力されたよ。
[/code]

ありがとうござました。

## 追伸

`import sys; print(sys.version)`を print_Version.py というファイルにして試してみました。

[code]

    E:\work\python\lesson>print_Version.py
    3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]
[/code]

[code]

    E:\work\python\lesson>C:\Python24\\python print_Version.py
    2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)]
[/code]


CC BY-SA 4.0
2018-09-07T06:46:45.673
48175
2018-09-10T07:38:49.483
2018-09-10T07:38:49.483
30007
30007
48146
answer