การฝัง Python ในแอพ iPhone


96

ดังนั้นจึงเป็นสหัสวรรษใหม่ แอปเปิลโบกมือ ตอนนี้การรวมล่าม Python ในแอพ iPhone (App Store) ถูกกฎหมาย

เราจะทำสิ่งนี้ได้อย่างไร? การสนทนาที่มีอยู่ทั้งหมด (ไม่น่าแปลกใจ) หมายถึงการแหกคุก (คำถามที่เก่ากว่า: ฉันสามารถเขียนแอพของ iPhone โดยใช้ Python ได้หรือไม่ )

เป้าหมายของฉันที่นี่ไม่ใช่การเขียนแอป PyObjC แต่เพื่อเขียนแอป ObjC ปกติที่เรียกใช้ Python เป็นไลบรารีแบบฝัง จากนั้นรหัส Python จะเรียกกลับไปที่รหัสโกโก้ดั้งเดิม เป็นรูปแบบ "control logic is Python code"

มีคำแนะนำในการสร้าง Python ใน XCode หรือไม่เพื่อให้แอป iPhone ของฉันสามารถเชื่อมโยงได้ โดยเฉพาะอย่างยิ่ง Python ที่ถูกถอดออกเนื่องจากฉันไม่ต้องการ 90% ของไลบรารีมาตรฐาน

ฉันสามารถหา API ของเธรดและส่วนขยาย Python ได้ ฉันทำเสร็จแล้วบน MacOS แต่ใช้คอมไพเลอร์บรรทัดคำสั่งเท่านั้นไม่ใช่ XCode


คำตอบ:


30

ไม่สำคัญว่าคุณจะสร้าง Python อย่างไร - คุณไม่จำเป็นต้องสร้างใน Xcode แต่สิ่งที่สำคัญคือผลของการสร้างนั้น

กล่าวคือคุณจะต้องสร้างบางสิ่งเช่น libPython.a ที่สามารถเชื่อมโยงกับแอปพลิเคชันของคุณแบบคงที่ เมื่อคุณมี. a แล้วสามารถเพิ่มลงในโปรเจ็กต์ Xcode สำหรับแอปพลิเคชันของคุณจากนั้นระบบจะเชื่อมโยงและลงนามเหมือนกับแอปอื่น ๆ ของคุณ

IIRC (เป็นเวลานานแล้วที่ฉันสร้าง python ด้วยมือ) python ที่ไม่อยู่ในกล่องจะสร้าง libPython.a (และไลบรารีอื่น ๆ อีกมากมาย) หากคุณกำหนดค่าอย่างถูกต้อง

แน่นอนปัญหาที่สองของคุณจะเป็นการรวบรวมข้ามไพ ธ อนสำหรับ ARM จากกล่อง86ของคุณ Python เป็นโครงการที่ใช้ autoconf และ autoconf เป็นความเจ็บปวดที่ก้นในการรวบรวมข้าม

ในขณะที่คุณระบุอย่างถูกต้องการทำให้เล็กลงจะเป็นเรื่องสำคัญ

ไม่น่าแปลกใจที่คุณไม่ใช่คนแรกที่ต้องการทำสิ่งนี้ แต่ไม่ใช่สำหรับ iOS Python ถูกบีบลงในอุปกรณ์ที่มีความสามารถน้อยกว่าอุปกรณ์ที่ใช้ iOS มาก ฉันพบกระทู้ที่มีลิงค์มากมายเมื่อ googling เกี่ยวกับ; มันอาจจะมีประโยชน์

นอกจากนี้คุณอาจต้องการที่จะเข้าร่วมPyObjC-devรายการ แม้ว่าคุณจะไม่ได้กำหนดเป้าหมายไปที่แอปพลิเคชันที่ใช้ PyObjC (ซึ่งก็เป็นความคิดที่ดี - PyObjC มีหนทางอีกยาวไกลก่อนที่มันจะเป็น iOS ที่เป็นมิตร) ชุมชน PyObjC ได้พูดคุยเรื่องนี้และ Ronald จากทุกคน น่าจะเป็นคนที่มีความรู้มากที่สุดในด้านนี้ โปรดทราบว่า PyObjC จะต้องแก้ปัญหา Python ที่ฝังตัวบน iOS ก่อนที่จะพอร์ต PyObjC ข้อกำหนดเบื้องต้นของพวกเขาคือความต้องการของคุณเหมือนเดิม


ขอบคุณสำหรับลิงค์ (ผมใช้งูหลามบน Sharp Zaurus หามากรุ่นก่อนหน้าของโครงการนี้ แต่นั่นก็เป็นงูหลาม 1.6 และคนอื่นทำบรรจุภัณฑ์ ... )
แอนดรู Plotkin

4
ครั้งหนึ่งฉันย้าย Python ไปยัง PSP ของ Sony; บางทีประวัติการโค่นล้มบางส่วนจะช่วยคุณได้ ไม่ใช่คำตอบที่แน่นอน ที่นี่: python-psp.net/trac
fraca7

22

ฉันได้ใส่สคริปต์ที่หยาบมากบน github ที่ดึงและสร้าง python2.6.5 สำหรับ iPhone และโปรแกรมจำลอง

http://github.com/cobbal/python-for-iphone

อยู่ระหว่างดำเนินการ

การอัปเดตที่ค่อนข้างน่าหดหู่เกือบ 2 ปีต่อมา: (คัดลอกจาก README บน github)

โปรเจ็กต์นี้ไม่เคยทำให้ python ทำงานบน iPhone จนเป็นที่พอใจของฉันเลยและฉันไม่สามารถแนะนำให้ใช้กับโปรเจ็กต์ที่จริงจังในขั้นตอนนี้

สิ่งที่ขาดหายไปส่วนใหญ่คือการรองรับ pyobjc (ซึ่งกลายเป็นว่ายากกว่ามากในการพอร์ตไปยัง iPhone เนื่องจากต้องใช้รหัสเฉพาะแพลตฟอร์มมากกว่า)

สิ่งที่ขาดหายไปคือความสามารถในการคอมไพล์โมดูลแบบคงที่ (ปัจจุบันทั้งหมดถูกสร้างขึ้นเป็น dylibs ที่ใช้งานได้สำหรับการพัฒนา แต่สำหรับความรู้ของฉันจะไม่ได้รับอนุญาตใน App Store)

ณ จุดนี้โครงการนี้ส่วนใหญ่มีขึ้นเพื่อเป็นจุดเริ่มต้นสำหรับใครก็ตามที่ฉลาดกว่าฉันที่ต้องการและสามารถจัดการกับปัญหาข้างต้นได้

ฉันหวังว่าการเขียนแอปทั้งหมดใน Python จะทำได้จริง แต่ ณ จุดนี้ดูเหมือนจะเป็นไปไม่ได้


ขอบคุณ! ฉันจะไม่มีโอกาสได้ดูสักสองสามวัน แต่ฉันจะลองดูในเร็ว ๆ นี้
Andrew Plotkin

ถ้าpyobjcยากที่จะรวบรวมมันเป็นไปได้ที่จะใช้ctypes? ในกรณีนี้คำตอบนี้อาจเป็นเบาะแส (โดยตระหนักว่ามันเป็นเพียงจุดเริ่มต้นของงานที่ยิ่งใหญ่และเจ็บปวด แต่ก็ยัง)
Jacob Oscarson

10

ฉันยังเริ่มโครงการดังกล่าว มันมาพร้อมกับสคริปต์คอมไพล์ที่เรียบง่ายของตัวเองดังนั้นจึงไม่จำเป็นต้องยุ่งกับ autoconf เพื่อรับไลบรารีคงที่คอมไพล์ข้ามของคุณ มันสามารถสร้างไลบรารีคงที่ที่ปราศจากการพึ่งพาของ Python ด้วยโมดูลทั่วไปบางส่วน มันควรจะขยายได้ง่าย

https://github.com/albertz/python-embedded/


ฉันไม่ได้รับ compilescript ของคุณทำงาน มันรวบรวม แต่ขาดโมดูลในตัวบางอย่างเช่น '-collections' ความคิดใด ๆ ?
bijan

ฉันไม่ได้รวมโมดูล C ดั้งเดิมทั้งหมด เพียงแค่ปรับเปลี่ยนมัน
Albert

ดูเหมือนจะลงวันที่ ... ใช้งานได้กับ iOS 4.3 เท่านั้น? คุณช่วยจัดทำเอกสารวิธีทำให้สิ่งนี้ทำงานกับเวอร์ชันปัจจุบันเพิ่มเติมได้ไหม
ArtOfWarfare

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