สำหรับpython -cวิธีแก้ปัญหาและให้คุณใช้ Bash เชลล์ได้คุณสามารถมีไวยากรณ์แบบบรรทัดเดียวแบบง่าย ๆ ในตัวอย่างนี้
สมมติว่าคุณต้องการทำสิ่งนี้ (คล้ายกับตัวอย่างของคุณรวมถึงexcept: passคำแนะนำ):
python -c "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path
สิ่งนี้จะไม่ทำงานและทำให้เกิดข้อผิดพลาดนี้:
File "<string>", line 1
from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
^
SyntaxError: unexpected character after line continuation character `
นี่เป็นเพราะการแข่งขันระหว่าง Bash และ Python การตีความของ\nescape sequences เพื่อแก้ปัญหาหนึ่งสามารถใช้$'string'ไวยากรณ์ Bash เพื่อบังคับให้\nตีความ Bash ก่อน Python เพื่อให้ตัวอย่างท้าทายยิ่งขึ้นฉันได้เพิ่มend=..\n..ข้อกำหนดทั่วไปของ Python ในการเรียกใช้งานการพิมพ์ของ Python: ในตอนท้ายคุณจะได้รับ\nการตีความทั้งสองจากการทุบตีและ Python ทำงานร่วมกัน ดังนั้นในที่สุดทางออกที่เหมาะสมก็เป็นเช่นนี้:
python -c $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path
ซึ่งนำไปสู่ผลลัพธ์ที่สะอาดอย่างเหมาะสมโดยไม่มีข้อผิดพลาด:
/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello
หมายเหตุ: สิ่งนี้ควรทำงานได้ดีกับexecโซลูชันที่มุ่งเน้นเนื่องจากปัญหายังคงเหมือนเดิม (การแข่งขันล่าม Bash และ Python)
Note2: เราสามารถแก้ไขปัญหาด้วยการแทนที่บาง\nส่วน;แต่มันจะไม่ทำงานทุกที่ทุกเวลา (ขึ้นอยู่กับการสร้างของ Python) ในขณะที่โซลูชันของฉันอนุญาตให้ "หนึ่งบรรทัด" โปรแกรม Python แบบหลายบรรทัดคลาสสิกเสมอ
Note3: แน่นอนเมื่อหนึ่งซับหนึ่งได้เสมอที่จะดูแลพื้นที่หลามและเยื้องเพราะในความเป็นจริงเราจะไม่เคร่งครัด "หนึ่งซับ" ที่นี่ แต่ทำที่เหมาะสมผสมการจัดการของ\nลำดับหนีระหว่างทุบตีและ Python . นี่คือวิธีที่เราสามารถจัดการกับโปรแกรม Python หลายบรรทัดแบบคลาสสิก ตัวอย่างโซลูชันแสดงสิ่งนี้เช่นกัน