การวาง% magic ของ IPython ทำงานอย่างไร


95

ฉันต้องการคัดลอกโค้ด Python ที่เยื้องไปแล้ว / ฟังก์ชันและคลาสทั้งหมดลงใน IPython ทุกครั้งที่ฉันพยายามเยื้องจะเมาและฉันได้รับข้อความแสดงข้อผิดพลาดดังต่อไปนี้:

IndentationError: unindent does not match any outer indentation level (<ipython-input-23-354f8c8be51b>, line 12)

If you want to paste code into IPython, try the %paste and %cpaste magic functions.


3
ฉันรู้ว่ามันน่าจะอยู่ใน stackoverflow แล้ว แต่ไม่พบหลังจาก 3 การค้นหาดังนั้นฉันจึงเพิ่มเวอร์ชันของตัวเอง
Framester

คำตอบ:


141

คุณไม่สามารถคัดลอกไปยัง IPython ได้โดยตรง นี่คือขั้นตอน:

  1. คัดลอกบรรทัดที่คุณต้องการคัดลอกไปยัง IPython ลงในคลิปบอร์ด
  2. ใส่%pasteลงไปใน IPython
  3. กดปุ่มตกลง
  4. กำไร!

48
% การวางต้องใช้ Tkinter ดังนั้นหากคุณไม่มีทางเลือกอื่นที่ดีคือ% cpaste
yekta

64
จริงๆคุณสามารถคัดลอกโค้ดไป IPython โดยตรง: %autoindentคุณอาจจะต้องปิดการใช้งานครั้งแรกอัตโนมัติเยื้องโดยการป้อน
Eric O Lebigot

ขอบคุณ EOL! +1 สำหรับคุณ
Framester

5
ในIpython 5 คุณสามารถวางรหัสได้ ไม่ต้องการ%pasteอีกต่อไป อ่านคำตอบนี้
Levon

1
คุณไม่ต้องการ% ก่อนpasteอย่างใดอย่างหนึ่ง
พูดต่อไปใน

41

คำชี้แจงเกี่ยวกับขั้นตอน:

  • ขั้นแรกคัดลอกเส้นเป้าหมายไปยังคลิปบอร์ดของคุณ

  • พิมพ์ลงในพรอมต์ iPython:

    • หากอยู่ใน Tkinter ให้ป้อน %paste
    • มิฉะนั้น: ป้อน %cpaste
  • วาง (Ctrl-V) แล้วกด Enter

  • จากนั้นพิมพ์--และกด Enter

ตัวอย่างเช่น:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for l in "Hello World":
:    print l,
:--
H e l l o   W o r l d

3
คุณไม่จำเป็นต้อง Ctrl-V พิมพ์เฉพาะ% วางแล้วกด Enter
SeF

23

สำหรับIpython 5คุณไม่จำเป็นต้องมีคำสั่งวิเศษเพียงแค่วางมัน

ipython5

ขอขอบคุณที่prompt_toolkit, IPythonในขณะนี้สนับสนุน:

  • การเน้นไวยากรณ์ขณะที่คุณพิมพ์
  • การแก้ไขหลายบรรทัดจริง (ปุ่มลูกศรขึ้นและลงเลื่อนไปมาระหว่างบรรทัด)
  • วางหลายบรรทัดโดยไม่ทำลายการเยื้องหรือเรียกใช้โค้ดทันที
  • อินเทอร์เฟซการเติมโค้ดที่ดีขึ้น (เราวางแผนที่จะปรับปรุงเพิ่มเติม)

เพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

เพื่ออัปเกรดipythonเป็นเวอร์ชันล่าสุด

pip install ipython --upgrade 

เป็นไปได้หรือไม่ที่จะวางหลายบรรทัดและรันโค้ดโดยอัตโนมัติในแต่ละบรรทัด
Eric Duminil

ใช่เพียงแค่วางรหัสแล้วกด Enter หากคุณต้องการแก้จุดบกพร่องให้ตรวจสอบ% pdb หรือ ipdb ตัวอย่าง
Levon

นอกจากนี้ยังรองรับเอาต์พุตของ Python repl ซึ่งเป็นรหัสที่ขึ้นต้นด้วยสาม>สัญญาณดังนี้>>> a = 1 + 2
Flimm

ตลอดเวลาที่ฉันทำ% cpaste .. ดี!
Gershon Herczeg

1
ฉันคิดว่ามันขึ้นอยู่กับสภาพแวดล้อมที่คุณกำลังทำการวางและวิธีการวาง? เพื่อนร่วมงานของฉันใช้พรอมต์คำสั่งของ Windows 10 เพื่อ SSH ในโฮสต์ Linux ของเราเปิด ipython ในคอนเทนเนอร์ Docker ที่นั่นและพยายามวางโค้ดที่เยื้องแล้ว (โดยคลิกขวา ) และเขาจะได้รับการเยื้องพิเศษแม้ใน iPython 7.8.0 วิธีที่ฉันเข้าใจพฤติกรรมการคลิกขวาของพรอมต์คำสั่งคือจริงๆแล้วมันใช้สิ่งที่อยู่ในคลิปบอร์ดและแสดงทีละอักขระราวกับว่าคุณกำลังพิมพ์ ดังนั้น iPython จึงไม่มีทางรู้ว่าคุณกำลังวางอยู่
Kal

6

%pasteTkinterต้อง หากคุณอยู่ในอูบุนตูคุณสามารถติดตั้งได้โดย

sudo apt-get install python-tk

หากคุณใช้ Python3

sudo apt-get install python3-tk

จากนั้นรีสตาร์ท ipython และใช้%pasteเพื่อวางจากคลิปบอร์ดของคุณ


2

หนึ่งในคำตอบที่เป็นประโยชน์หายไปในความคิดเห็นดังนั้นจึงต้องการที่จะกล่าวซ้ำพร้อมกับการเพิ่มการอ้างอิงสำหรับฟังก์ชันมายากล IPython ที่มีประโยชน์อื่น ๆ

ก่อนอื่นให้ทบทวนสิ่งที่ @EOL กล่าววิธีหนึ่งในการแก้ปัญหาของ OP คือปิดการเยื้องอัตโนมัติโดยการเรียกใช้ครั้งแรก%autoindentและทำการวาง (ไม่จำเป็นหากคุณใช้%pasteแน่นอน)

ตอนนี้เพื่อเพิ่มข้อมูลเพิ่มเติมให้กับสิ่งที่มีอยู่แล้วที่นี่โหมดที่มีประโยชน์อีกโหมดหนึ่งใน IPython คือ%doctest_modeช่วยให้คุณสามารถคัดลอกตัวอย่างการวางและทดสอบตัวอย่างจากสตริง doc นอกจากนี้ยังมีประโยชน์ในการรันเอาต์พุตเซสชัน python แบบโต้ตอบที่คุณสามารถพบได้ในเอกสารและฟอรัมออนไลน์โดยไม่ต้องตัดสตริงพร้อมต์


1

สำหรับผู้ใช้ Ubuntu ที่ใช้ Python 3

python-tkสำหรับงูหลาม 2

ในการ%pasteทำงานบน Python 3 ให้ติดตั้งpython3-tkแพ็คเกจ:

sudo apt-get install python3-tk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.