IronPython กับ Python .NET


88

ฉันต้องการเข้าถึงแอสเซมบลี. NET บางตัวที่เขียนด้วย C # จากโค้ด Python

การวิจัยเล็กน้อยแสดงให้เห็นว่าฉันมีสองทางเลือก:

  • IronPythonพร้อมความสามารถในการเชื่อมต่อ. NET / การสนับสนุนในตัว
  • Python ด้วยแพ็คเกจPython .NET

การแลกเปลี่ยนระหว่างโซลูชันทั้งสองคืออะไร?

คำตอบ:


71

หากคุณต้องการใช้โค้ดของคุณเป็นหลักบนเฟรมเวิร์ก. NET ฉันขอแนะนำ IronPython vs Python.NET IronPython เป็น. NET แบบดั้งเดิม - ดังนั้นจึงใช้งานได้ดีเมื่อรวมกับภาษา. NET อื่น ๆ

Python.NET เป็นสิ่งที่ดีหากคุณต้องการรวมส่วนประกอบหนึ่งหรือสองส่วนจาก. NET เข้ากับแอปพลิเคชัน python มาตรฐาน

มีความแตกต่างที่น่าทึ่งเมื่อใช้ IronPython - แต่ส่วนใหญ่ค่อนข้างบอบบาง Python.NET ใช้รันไทม์ CPython มาตรฐานดังนั้นหน้า Wiki นี้จึงเป็นการอภิปรายที่เกี่ยวข้องของความแตกต่างระหว่างการใช้งานทั้งสอง ความแตกต่างที่ใหญ่ที่สุดเกิดขึ้นในค่าใช้จ่ายของข้อยกเว้นดังนั้นไลบรารี python มาตรฐานบางส่วนจึงทำงานได้ไม่ดีใน IronPython เนื่องจากการใช้


11
IronPython มีข้อยกเว้น "น้ำหนักเบา" ซึ่งเร็วกว่ามาก การทดสอบ TryRaiseExcept จาก PyBench ซึ่งทำงานช้าลง 60 เท่าตอนนี้ช้าลงเพียง 1.6 เท่า WithRaiseExcept ยังคงช้า แต่เร็วกว่าเดิม 4 เท่า สำหรับการทดสอบอื่น ๆ ส่วนใหญ่ IPY เป็นจริงได้เร็วขึ้น การเปรียบเทียบประสิทธิภาพของ IronPython 2.7 กับ CPython 2.7 ( รายการเกณฑ์มาตรฐานทั้งหมด )
Athari

29

ในขณะที่เห็นด้วยกับคำตอบของ Reed Copsey และ Alex Martelli ฉันต้องการชี้ให้เห็นความแตกต่างอีกประการหนึ่งนั่นคือ Global Interpreter Lock (GIL) แม้ว่า IronPython จะไม่มีข้อ จำกัด ของ GIL แต่ CPython ก็ทำเช่นนั้นดังนั้นดูเหมือนว่าสำหรับแอปพลิเคชันเหล่านั้นที่ GIL เป็นคอขวดให้พูดในสถานการณ์มัลติคอร์บางสถานการณ์ IronPython มีข้อได้เปรียบเหนือ Python.NET

จากเอกสาร Python.NET:

หมายเหตุสำคัญสำหรับโปรแกรมฝังตัว: Python ไม่ใช่เธรดอิสระและใช้ล็อกล่ามส่วนกลางเพื่ออนุญาตให้แอปพลิเคชันแบบมัลติเธรดโต้ตอบกับล่าม Python ได้อย่างปลอดภัย ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้มีอยู่ในเอกสาร Python C API บน www.python.orgเว็บไซต์

เมื่อฝัง Python ในแอปพลิเคชันที่มีการจัดการคุณต้องจัดการ GIL ในลักษณะเดียวกับที่คุณทำเมื่อฝัง Python ในแอปพลิเคชัน C หรือ C ++

ก่อนที่จะโต้ตอบกับอ็อบเจ็กต์หรือ API ใด ๆ ที่ Python.Runtimeเนมสเปซมีให้รหัสการเรียกต้องได้รับการล็อกตัวแปลส่วนกลางของ Python โดยเรียกใช้ PythonEngine.AcquireLockเมธอด ข้อยกเว้นเดียวของกฎนี้คือ PythonEngine.Initializeวิธีการซึ่งอาจเรียกได้ว่าเริ่มต้นโดยไม่ต้องได้รับ GIL

เมื่อใช้ Python API เสร็จแล้วโค้ดที่ได้รับการจัดการจะต้องเรียกสิ่งที่เกี่ยวข้อง PythonEngine.ReleaseLockเพื่อปล่อย GIL และอนุญาตให้เธรดอื่นใช้ Python

AcquireLockและReleaseLock วิธีการห่อมีบางช่วงที่ไม่มีการจัดการPyGILState_Ensureและ PyGILState_Releaseฟังก์ชั่นจากงูหลาม API และเอกสารสำหรับ API ผู้ใช้กับรุ่นที่มีการจัดการ

อีกปัญหาหนึ่งคือการสนับสนุน IDE CPython อาจมีการรองรับ IDE ที่ดีกว่า IronPython ในปัจจุบัน - ดังนั้นนี่อาจเป็นปัจจัยในการเลือกอย่างใดอย่างหนึ่ง


4
ปลั๊กอิน PyDev Eclipse รองรับ CPython, IronPython และ Jython
Knut Eldhuset

3
@ นัท: ใช่ แต่นั่นไม่ใช่สถานการณ์เมื่อฉันเขียนคำตอบนี้
Vinay Sajip

18

ไลบรารี Python ทางวิทยาศาสตร์และตัวเลขส่วนใหญ่ที่ใช้ CPython C-API (numpy, scipy, matplotlib, pandas, cython ฯลฯ ) ส่วนใหญ่ทำงานภายใต้ CPython ดังนั้นในกรณีนี้ทางออกที่ดีที่สุดของคุณคือ pythonnet (ชื่ออื่น - Python.NET และ Python สำหรับ. NET) เช่นเดียวกับการผูก CPython GUI เช่น WxWidgets, PyQt / PySide, GTK, Kivy เป็นต้นแม้ว่าทั้ง pythonnet และ IronPython สามารถใช้ WPF และ WinForms ได้

และในที่สุด IronPython ก็ยังไม่รองรับ Python 3 อย่างสมบูรณ์


9

IronPython คือ ".NET-native" - ​​ดังนั้นจะดีกว่าถ้าคุณต้องการรวมโค้ด Python ของคุณเข้ากับ. NET อย่างสมบูรณ์ Python.NET ทำงานร่วมกับ Classic Python ดังนั้นจึงช่วยให้คุณรักษา "ความยาวแขน" ของโค้ด Python ให้ห่างจาก. NET ได้อย่างเหมาะสม (โปรดทราบว่าด้วยรหัสนี้คุณสามารถใช้ส่วนขยายที่เขียนขึ้นสำหรับ CPython จากรหัส IronPython ของคุณได้ดังนั้นจึงไม่ใช่เงื่อนไขที่เลือกปฏิบัติอีกต่อไป)


6

IronPython มาจาก Microsoft ดังนั้นฉันจะไปกับลำไส้ของฉันและใช้สิ่งนั้นก่อนเพราะคุณต้องคิดว่ามันจะเล่นได้ดีกว่ากับเทคโนโลยี MSFT อื่น ๆ


ฉันสงสัยสิ่งนี้เนื่องจากไม่ใช่ส่วนหนึ่งของ vs20xx
user3800527

4

สำหรับปี 2559.

ใน บริษัท ของฉันเราใช้ IronPython แต่เราไม่พอใจกับการแสดง (ส่วนใหญ่ใช้หน่วยความจำ - ตัวเก็บขยะช้าเกินไป) ดังนั้นเราจึงตัดสินใจเปลี่ยนไปใช้ Python มาตรฐานและรวมเข้ากับ. Net โดยใช้ Zeroce-s ICE


ฉันประหลาดใจที่ RPC ระหว่างกระบวนการต่างๆถูกเลือกด้วยเหตุผลด้านประสิทธิภาพ CPython + .NET ที่ใช้ pythonnet ในกระบวนการเดียวกันน่าจะเร็วกว่าวิธีนี้ สำหรับ Zeroce ICE โปรดทราบว่าเป็นลิขสิทธิ์ GPL ดังนั้นจึงไม่เหมาะสำหรับการใช้งานเชิงพาณิชย์
denfromufa

วิธีแก้ปัญหาที่น่าสนใจขอบคุณ สำหรับการออกใบอนุญาตมีตัวเลือกทางการค้าสำหรับ ICE: zeroc.com/licensing
Atorian


1
  1. Ironpython ก็เหมือนกับ C # ในทางกลับกันมันอาศัยไลบรารีที่สร้างไว้ล่วงหน้าแบบคงที่ในขณะที่ไม่เหมือน C # เป็นภาษาแบบไดนามิก

  2. Cpython เหมือนกับ C ++ เช่น Ironpython เป็นภาษาแบบไดนามิกและสามารถเข้าถึงไลบรารีแบบไดนามิกซึ่งจะแปลว่าถูกบังคับให้เขียนทุกอย่าง

  3. Ironpython เร็วกว่า C # ในบางพื้นที่ แต่ไม่เร็วกว่า Cpython อย่างไรก็ตามคุณสามารถเชื่อมโยง Ironpython กับภาษาใดก็ได้ดังนั้นเมื่อมีปัญหาตามมา แต่คุณสามารถทำเช่นเดียวกันกับ Cpython ได้อีกครั้ง

ภาษาที่ตลกเรียบง่ายและทรงพลังไม่ว่าคุณจะเลือกอะไร!


1

Iron Python นั้นโดยทั่วไปแล้ว Python 2.7 พร้อมการรองรับ. net ในตัวซึ่งอาจจะไม่รองรับ Python 3 มันสูญเสียไลบรารี C และ Python อย่างไรก็ตามในด้านการบิดสามารถเข้าถึง. net และสามารถขยายได้ด้วย C # ดังนั้นหากคุณใช้ C # อยู่แล้ว Iron Python ก็เป็นโบนัส


-1

ฉันชอบ Python เป็นหลักสำหรับ. NET เนื่องจาก IronPython ถูกคอมไพล์เป็นโค้ดที่มีการจัดการซึ่งสามารถถอดรหัสได้อย่างง่ายดาย (สิ่งที่ฉันเกลียดที่สุด) แต่ด้วย py2exe หรือ pyinstaller คุณสามารถรวบรวม Python กับโมดูล NET เป็นแอปพลิเคชันที่ไม่มีการจัดการ

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