web-dev-qa-db-ja.com

Pythonインタラクティブインタプリタとインデントにコピーアンドペースト

このコード、ファイルtest.py

_if 1:
   print "foo"
print "bar"
_

execfile("test.py")または_python test.py_で正常に実行できますが、コピーしてPythonインタープリター:

_File "<stdin>", line 3
print "bar"
        ^
SyntaxError: invalid syntax
_

なぜそうなのですか?インタプリタは、コピーして貼り付けたテキストを正常に読み取るように構成できますか?

インタプリタの入力に影響するかもしれませんが、私にとっては問題ありません。

16
pms

インデントが失われたか壊れている可能性があります。

IPython -拡張されたpythonインタープリターで多くの便利な機能を備えています。そのうちの1つは、複数を貼り付けることができる魔法の関数%pasteです。コード行。

また、タブ補完、自動インデントなどがあります。彼らのサイトを見てください。


Ipythonで%pasteを使用する:

enter image description here

そして、コピーアンドペーストはqtコンソールで修正されたものの1つです。ここでは、新しいipython qtconsoleでコードブロックの単純な古いコピーアンドペーストを「正しく機能」させています。

enter image description here

17
rplnt

標準コマンドPromptのトリックはわかりませんが、複数行の貼り付け用の特別な構文を持つ IPython のようなより高度なインタープリターを提案できます。

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:for c in range(3):
:    print c
:
:--
0
1
2

もう1つのオプションは、自動貼り付けモードを備えた bpython インタープリターです(入力が速すぎて人間になれない場合)。

>>> for c in range(3):
...     print c
... 
0
1
2
>>> 
 <C-r> Rewind  <C-s> Save  <F8> Pastebin  <F9> Pager  <F2> Show Source 
18
naufraghi

行う %autoindent自動インデントをオフにします。その後、IPythonでコードを貼り付けることができます。

7
Awais

複数行の構成を入力する場合は、継続行が必要です。 -- インタラクティブモードPythonチュートリアル (v2)( v

したがって、次のように入力する必要があります。

if 1:
   print "foo"

print "bar"

残念ながら、なぜそれが非対話型セッションと異なるのかについて、適切な説明をまだ見つけていません。

6
Johnsyweb

同様の問題について最近見つけたもう1つの解決策:

$ python << EOF
if 1:
   print "foo"
print "bar"

EOF
2
patentfox

現在の回答はすべて、IPythonに変更することを提案しています。 Pythonのみのソリューションの場合、 textwrap を使用して、行から先頭の空白を削除できます。

例えば、

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
1
eqzx

あなたが私のようで、 Notepad ++ (コピーアンドペースト)を使用している場合、タブをスペースに置き換えてみてくださいメニュー設定設定言語そしてスペースによる置換を確認します。

私は長い間この問題を抱えていましたが、python.exeがスペースを認識することがわかりました。

0
Flavio Rajta