จะใช้อินพุตของ Python () กับ External Evaluation ได้อย่างไร?

Aug 27 2020

ฉันต้องการใช้ input () ในโค้ด Python ซึ่งทำงานใน Wolfram Notebook

ดังนั้นฉันจึงสร้างเซลล์การประเมินภายนอกโดยพิมพ์ ">" แล้วเลือก Python จากนั้นฉันจะกำหนดฟังก์ชันนี้:

def func():
    x = input()
    print(x)

จากนั้นฉันพยายามเรียกมันว่า:

func()

ซึ่งทำให้ Mathematica ทำงานตลอดไปและไม่มีการประเมิน

ฉันสามารถเรียกอินพุตของ Python () จากในโน้ตบุ๊กได้หรือไม่

2020-09-04 อัปเดต "input () อ่านจากอินพุตมาตรฐานไม่มีอินพุตมาตรฐานเมื่อใช้โน้ตบุ๊ก"

ใช่ แต่ Jupyter รองรับ

คำตอบ

3 MichaelChen Sep 04 2020 at 23:14

ฉันพบเคล็ดลับโดยใช้ TemplateExpression <* *>และ SetDelayed ใน Mathematica

ตัวอย่างเช่นฉันพยายามกำหนดฟังก์ชัน python เช่นนี้ซึ่งซ้ำกับสตริงอินพุต:

def func():
    return input()*2

รหัส Mathematica คือ:

pysession = StartExternalSession["Python"];
wlfunc[] := ExternalEvaluate[pysession, "<* InputString[] *> *2"]
ExternalEvaluate[pysession, "func = <* wlfunc *>"]

(โปรดทราบว่าฟังก์ชัน python inputเทียบเท่ากับฟังก์ชัน Mathematica InputString)

ตอนนี้ฟังก์ชันที่funcกำหนดในเซสชัน python สามารถรับอินพุตจาก FrontEnd ของ Mathematica:

ExternalEvaluate[pysession, "[func() for i in range(3)]"]

ฉันควรพูดถึงว่าเคล็ดลับนี้ค่อนข้าง จำกัด เช่น

ExternalEvaluate[pysession, "func() + func()"]

จะส่งคืน a Failureเนื่องจากฟังก์ชันถูกกำหนดอย่างมีประสิทธิภาพใน Mathematica แทนที่จะเป็น python เพื่อหลีกเลี่ยงปัญหานี้ให้ใช้

ExternalEvaluate[pysession, "<* wlfunc[] *> + <* wlfunc[] *>"]