จะใช้อินพุตของ Python () กับ External Evaluation ได้อย่างไร?
ฉันต้องการใช้ input () ในโค้ด Python ซึ่งทำงานใน Wolfram Notebook
ดังนั้นฉันจึงสร้างเซลล์การประเมินภายนอกโดยพิมพ์ ">" แล้วเลือก Python จากนั้นฉันจะกำหนดฟังก์ชันนี้:
def func():
x = input()
print(x)
จากนั้นฉันพยายามเรียกมันว่า:
func()
ซึ่งทำให้ Mathematica ทำงานตลอดไปและไม่มีการประเมิน
ฉันสามารถเรียกอินพุตของ Python () จากในโน้ตบุ๊กได้หรือไม่
2020-09-04 อัปเดต "input () อ่านจากอินพุตมาตรฐานไม่มีอินพุตมาตรฐานเมื่อใช้โน้ตบุ๊ก"
ใช่ แต่ Jupyter รองรับ
คำตอบ
ฉันพบเคล็ดลับโดยใช้ 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[] *>"]