簡體   English   中英

復制粘貼到 Python 交互式解釋器和縮進中

[英]Copy-paste into Python interactive interpreter and indentation

這段代碼,文件test.py

if 1:
   print "foo"
print "bar"

可以使用execfile("test.py")python test.py成功執行,但是當您嘗試將其復制粘貼到 Python 解釋器中時:

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

為什么會這樣? 解釋器是否可以通過配置成功讀取復制粘貼的文本?

我想這可能會影響在解釋器中輸入,但這對我來說沒問題。

縮進可能丟失或損壞。

看看IPython——它是一個增強的 Python 解釋器,具有許多方便的特性。 其中之一是一個神奇的函數%paste ,它允許您粘貼多行代碼。

它還具有制表符完成、自動縮進……等等。 看看他們的網站。


在 IPython 中使用%paste

在此處輸入圖片說明

復制和粘貼內容是 Qt 控制台中修復的內容之一。 這是在新的IPython qtconsole中使用“正常工作”的代碼塊的普通舊復制和粘貼:

在此處輸入圖片說明

我不知道標准命令提示符的任何技巧,但我可以建議您使用更高級的解釋器,例如IPython ,它具有用於多行粘貼的特殊語法:

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

另一種選擇是具有自動粘貼模式的bpython解釋器(如果您輸入的速度太快而無法成為人類):

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

%autoindent關閉自動縮進。 之后,您可以將代碼粘貼到 IPython 中。

輸入多行結構時需要連續行。 -- 交互模式Python 教程(v2) ( v3 )

所以你需要輸入:

if 1:
   print "foo"

print "bar"

我還沒有找到合適的解釋來解釋為什么它與非交互式會話不同,唉。

當前所有的答案都建議您改用 IPython。 對於僅限 Python 的解決方案,您可以使用textwrap從行中刪除前導空格。

例如,

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

如果您像我一樣使用Notepad++ (從中復制和粘貼),請嘗試通過轉到菜單設置首選項語言並檢查空格替換來用空格替換制表符

我自己有這個問題很長時間了,我發現 python.exe 識別空格。

我最近為類似問題找到的另一種解決方案:

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

EOF

如果粘貼的內容有任何空行,解釋器在遇到它們時會觸發評估。 如果空行之后的任何行有縮進,則會導致IndentationError因為之前的任何上下文都已關閉。

解決方案:

  • 在復制到剪貼板之前刪除任何空行。
  • 在復制到剪貼板之前,向空行添加任意數量的縮進(不需要匹配代碼)。

請注意,空格與制表符似乎無關緊要。

exec(pyperclip.paste())

只要您不介意使用exec 我想除了pyperclip之外的任何其他第三方剪貼板包都可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM