ฉันจะเผยแพร่โปรแกรม python ได้อย่างไร?


102

แอปพลิเคชันของฉันมีลักษณะดังนี้:

main.py
หน้าต่าง /
    __init__.py
    mainwindow.py
    ...
รุ่น /
    __init__.py
    orders.py
    ...
ทรัพยากร /
    image1.png
    logo.jpg
    ...

โปรแกรมเริ่มต้นด้วย main.py. มีวิธีที่ดีในการสร้างแอปพลิเคชัน 'ขั้นสุดท้าย' หรือไม่? ฉันกำลังคิดถึงบางอย่างเช่น py2exe / py2app แต่ไม่มีการคัดลอกตัวแปล / โมดูล python ลงในแอปพลิเคชันซึ่งมีเพียงไฟล์ปฏิบัติการเดียว

ฉันได้ดูที่ distutils แต่ดูเหมือนว่ามันจะติดตั้งโปรแกรมลงในไดเร็กทอรี Python ซึ่งไม่ปกติบนแพลตฟอร์มที่ไม่ใช่ linux

ในขณะนี้ฉันเพิ่งคัดลอกโฟลเดอร์ซอร์สทั้งหมดไปยังเครื่องเป้าหมายและสร้างนามแฝงmain.pywบน windows ความไม่สะดวกบางประการ:

  • ไอคอนนี้เป็นไอคอนหลามเริ่มต้น
  • ฉันต้องสร้างนามแฝงด้วยตนเอง
  • ในไดเร็กทอรีต้นทางของฉันมีไฟล์เพิ่มเติมจำนวนมากเช่นโฟลเดอร์ควบคุมแหล่งที่มา
  • ฉันต้องเปลี่ยนชื่อmain.pyเป็นmain.pywด้วยตนเอง
  • คงจะดีไม่น้อยหากมีเพียงไฟล์ ".pyo * เท่านั้นที่อยู่ในเครื่องเป้าหมาย ไม่มีเหตุผลที่แท้จริงสำหรับมันฉันแค่ไม่ชอบมีไฟล์ที่ไม่จำเป็น

เราจะสร้างการกระจายอัตโนมัติที่ดีได้อย่างไร

  • สำหรับ windows? (นั่นเป็นแพลตฟอร์มเดียวที่ฉันต้องสนับสนุนในขณะนี้)
  • สำหรับ mac?
  • สำหรับ linux?

2
"ฉันได้ดูสิ่งที่ผิดปกติ แต่ดูเหมือนว่ามันติดตั้งโปรแกรมลงในไดเร็กทอรี Python ซึ่งไม่ปกติบนแพลตฟอร์มที่ไม่ใช่ linux" ทำไมคุณถึงพูดอย่างนั้น? คุณอ่านข้อความใดที่กล่าวเช่นนั้น มันไม่จริงอย่างแน่นอนคุณได้รับความประทับใจนั้นมาจากไหน?
ล็อ


คำตอบ:


37

วิธีปกติของการกระจายการใช้งานหลามอยู่กับdistutils มันทำมาเพื่อแจกจ่ายโมดูล python ประเภทไลบรารีและแอปพลิเคชัน python แม้ว่าฉันจะไม่รู้ว่ามันทำงานบน Windows คุณจะต้องติดตั้ง Python แยกต่างหากใน Windows หากคุณใช้ distutils ไม่ว่าในกรณีใด ๆ

ฉันอาจแนะนำให้คุณแจกจ่ายด้วย disutils สำหรับ Linux และ Py2exe หรือสิ่งที่คล้ายกันสำหรับ Windows สำหรับ OS XI ไม่รู้ หากเป็นแอปพลิเคชันสำหรับผู้ใช้คุณอาจต้องการประเภทอิมเมจดิสก์ฉันไม่รู้ว่าจะทำอย่างไร แต่อ่านโพสต์นี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับประสบการณ์การใช้งานของผู้ใช้ สำหรับแอปพลิเคชันที่สร้างขึ้นสำหรับโปรแกรมเมอร์คุณอาจจะพอใจกับการติดตั้งประเภท distutils บน OS X ด้วย


1
Mac และ linux ไม่สำคัญในขณะนี้ Py2app ทำบันเดิล. app และฉันคิดว่าการจัดส่งแอป mac ใน. dmg ล้าสมัยควรใช้. zip เป็นไปได้ไหมที่จะใช้ distutils เพื่อสร้างไดเร็กทอรีdistและคัดลอกไฟล์ที่เกี่ยวข้องทั้งหมดลงในนั้น?
Georg Schölly

1
@gs: คำสั่ง sdist จะสร้างไฟล์ tar ของไฟล์ต้นฉบับทั้งหมด
Martin v. Löwis

5
@gs: การส่งแอพ Mac ใน. dmg เป็นเรื่องธรรมดามาก .dmg เป็นภาพดิสก์ไม่ใช่รูปแบบสำหรับแอปพลิเคชัน (ซึ่งจะเป็น. app) ดังนั้นคุณมักจะพบ. app เดียวภายใน. dmg พร้อมกับไฟล์ README บางไฟล์
Eric O Lebigot

3
@gs ฉันไม่รู้ว่าทำไมคุณถึงต้องการให้ distutils แค่สร้างไดเร็กทอรี dist และคัดลอกไฟล์ที่นั่นคุณสามารถทำได้ด้วยตัวเอง Distutils ทำหลายสิ่งหลายอย่างรวมถึงการสร้างตัวติดตั้ง windows และจาก Python 2.6 ยังสร้างลิงก์ในเมนูเริ่ม คุณจะต้องติดตั้ง Python แยกต่างหากดังนั้นสำหรับแอปสำหรับผู้ใช้ปลายทางฉันคิดว่า py2exe เป็นทางออกที่ดีกว่าเนื่องจากมี Python เป็นของตัวเอง การจัดส่ง / ผู้ติดตั้งสำหรับ OS X ได้รับการกล่าวถึงโดยละเอียดโดย Alexander Limi ในบล็อกโพสต์ของเขาดังนั้นฉันจึงรอเขา
Lennart Regebro


61

ฉันขอแนะนำPyinstallerซึ่งรองรับแพลตฟอร์มหลัก ๆ ทั้งหมดได้อย่างราบรื่น เช่นเดียวกับ py2exe และ py2app มันสร้างไฟล์ปฏิบัติการมาตรฐานบน Windows และชุดแอพบน OS X แต่มีประโยชน์ในการทำงานที่ยอดเยี่ยมในการแก้ไขการอ้างอิงทั่วไปโดยอัตโนมัติและรวมไว้โดยไม่ต้องปรับแต่งการกำหนดค่าเพิ่มเติม

โปรดทราบว่าหากคุณกำลังปรับใช้ Python 2.6 กับ Windows คุณควรใช้โปรแกรมแก้ไขนี้กับ Pyinstaller trunk

คุณระบุว่าคุณไม่จำเป็นต้องมีโปรแกรมติดตั้ง แต่เป็นการติดตั้งInnoเป็นตัวเลือกที่ใช้งานง่ายและรวดเร็วในการติดตั้งสำหรับแพลตฟอร์ม Windows


3
ฉันไม่แน่ใจว่ามันเกินความสามารถ การรวมแอพด้วย Pyinstaller นั้นง่ายกว่าวิธีอื่น ๆ โดยเฉพาะอย่างยิ่งการพึ่งพาส่วนขยาย c ... ง่ายเหมือนการเรียกบรรทัดคำสั่งบรรทัดเดียวในกรณีส่วนใหญ่ การติดตั้ง Python + dependencies + ตัวแอปเอง (ไม่ว่าจะผ่านทาง distutils ฯลฯ หรือแค่ไฟล์ zip) มีส่วนเกี่ยวข้องมากขึ้นโดยเฉพาะอย่างยิ่งหากนักพัฒนาไม่สามารถกำหนดค่าเครื่องเป้าหมายด้วยตนเองได้และจำเป็นต้องให้คำแนะนำแก่ลูกค้า อย่างน้อยใน Windows ฉันคิดว่ารูปแบบการกระจายสินค้านั้นสมเหตุสมผล
Daniel Naab

1
ไม่สะดวกเล็กน้อยกับ pyinstaller เมื่อคุณใช้ไฟล์ปฏิบัติการที่สร้างขึ้นด้วย pyinstaller การเริ่มต้นการดำเนินการใช้เวลาสักครู่
JuanPablo

1
สิ่งที่ฉันกำลังมองหา บางครั้งฉันต้องปล่อยให้สคริปต์ทำงานบนคอมพิวเตอร์โดยที่ฉันไม่สามารถติดตั้งอะไรได้เลย ไฟล์ปฏิบัติการเดียวที่ไม่มีการอ้างอิงภายนอกคือสิ่งที่ฉันต้องการ ฉันสามารถเผื่อเวลาไว้สักสองสามวินาทีสำหรับการเริ่มต้น ขอบคุณ!
CodeMonkey

ไม่แนะนำสำหรับแอปพลิเคชันขนาดเล็กเนื่องจากHello worldโปรแกรมธรรมดาจะใช้พื้นที่ 500MB และใช้เวลาเริ่มต้น 3-5 วินาที
Raf

คุณสามารถหลีกเลี่ยงพื้นที่จำนวนนี้ได้โดยใช้สภาพแวดล้อมแยกต่างหากเพื่อแจกจ่ายแอปพลิเคชันของคุณ (เช่นใช้ venv หรือ pyenv เป็นต้น)
Alexander Santos

4

Fredrik Lundh squeeze.pyสามารถสร้างไฟล์เดียวที่ไม่มี Python interpreter แต่มี bytecode แทน ด้วยอาร์กิวเมนต์ที่ถูกต้องคุณสามารถรวมไฟล์โมดูลและอื่น ๆ ในไฟล์ผลลัพธ์ได้ ฉันใช้มันสำเร็จในโครงการเดียว โปรแกรมผลลัพธ์รันบน OS X, Linux และ Windows โดยไม่มีปัญหา!

ปล. : แต่ละเครื่องต้องมีล่าม Python ซึ่งเข้ากันได้กับ bytecode ที่สร้างโดยบีบ คุณสามารถสร้าง bytecode เวอร์ชันที่แตกต่างกันสำหรับ Python เวอร์ชันต่างๆได้หากจำเป็น (เพียงแค่เรียกใช้ Squeeze.py ด้วย Python เวอร์ชันที่ถูกต้อง)


4

ฉันคิดว่ามันควรค่าแก่การกล่าวถึงPEX ด้วย (เมื่อพิจารณาถึงความสนใจที่มากขึ้นคำถามนี้ได้รับและคำถามน้อยลง) ตามคำอธิบายของมันเอง :

ไฟล์ PEX เป็นสภาพแวดล้อมเสมือน Python ที่ปฏิบัติการได้ในตัว โดยเฉพาะอย่างยิ่งไฟล์เหล่านี้เป็นไฟล์ zip ที่สร้างขึ้นอย่างระมัดระวังโดยมี a #!/usr/bin/env pythonและพิเศษ__main__.pyที่ช่วยให้คุณโต้ตอบกับรันไทม์ PEX สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานซิปดูPEP 441

ฉัน stumbled เมื่อมันเมื่อฉันอ่านภาพรวมของบรรจุภัณฑ์สำหรับหลาม พวกเขาโพสต์ภาพสวย ๆ นี้ที่นั่น: ป้อนคำอธิบายภาพที่นี่

สรุป: หากคุณสามารถจ่ายได้โดยอาศัย python ที่ติดตั้งบนเครื่องเป้าหมายให้ใช้ PEX เพื่อสร้าง»ปฏิบัติการ«ที่ประกอบด้วยตัวเองซึ่งอาจมีขนาดไฟล์ที่เล็กกว่าไฟล์ปฏิบัติการที่ผลิตโดย PyInstaller เป็นต้น


2

ฉันอาจจะเข้าใจผิด แต่ IronPython ไม่มีคอมไพเลอร์ในตัวสำหรับ windows หรือไม่?

http://www.ironpython.net

[แก้ไข]

ลองใช้ Cx_Freeze โดยคอมไพเลอร์. py ถึง. exe (บวก. dll สองสามตัว) ที่ดีที่สุดที่ฉันเคยใช้

http://cx-freeze.sourceforge.net/


1

หากคุณกำลังแจกจ่ายบน windows ให้ใช้โปรแกรมติดตั้งเพื่อติดตั้งไฟล์ / interpeter ที่เกี่ยวข้องทั้งหมดตามที่จำเป็น แจกจ่าย setup.exe นั่นคือวิธีที่ดีที่สุดบน windows มิฉะนั้นผู้ใช้จะบ่น


1
ฉันไม่ต้องการตัวติดตั้งเพราะมีผู้ใช้เพียงคนเดียวที่จะใช้โปรแกรมนี้ แต่แน่นอนเมื่อเขียนโปรแกรมสำหรับผู้ใช้จำนวนมากขึ้นซึ่งเป็นสิ่งที่ต้องมีบน windows
Georg Schölly

1
@gs: โอ้ผู้ใช้เพียงคนเดียว ดีฉันขอแนะนำให้สร้างแพ็คเกจ distutils พื้นฐานทั้งการแจกจ่ายซอร์สหรือตัวติดตั้งไบนารีของ windows นั่นเป็นวิธีที่ง่ายและดีในการแจกจ่ายโมดูล Python
Lennart Regebro

0

วิธีที่สะดวกที่สุด * ข้ามแพลตฟอร์มในการแจกจ่ายแอปพลิเคชันเดสก์ท็อป Python คือการพึ่งพาตัวจัดการแพ็คเกจ conda ข้ามแพลตฟอร์ม มีเครื่องมือหลายอย่างที่ใช้:

  • Miniconda-Install - สคริปต์ powershell / bash ที่ดาวน์โหลด Miniconda อัตโนมัติและสร้างสภาพแวดล้อม conda แยกสำหรับแอป รองรับ pip แต่ดูเหมือนจะไม่ได้รับการดูแลและมีปัญหาในการดาวน์โหลด https
  • Anaconda Projectและ(conda) constructorโดย Continuum ทั้งสองใช้ conda (conda) คอนสตรัคเตอร์ดูเหมือนจะสามารถสร้างตัวติดตั้งในตัวและแม้แต่ตัวติดตั้ง NSIS บน Windows แต่ไม่รองรับ pip ดูเหมือนจะทำตัวเหมือนผู้ติดตั้ง Anaconda / Miniconda
  • PyAppShare - ผู้ใช้ปลายทางติดตั้ง Miniconda / Anaconda ก่อน (เช่นสภาพแวดล้อมรันไทม์) จากนั้น single install batch / bash script สร้างสภาพแวดล้อม conda ที่แยกจาก yaml spec แอปพลิเคชันยังเป็นแพ็กเกจ conda / pip ที่ติดตั้งเข้ากับสภาพแวดล้อมและมีการสร้างจุดเข้าใช้งานที่เรียกใช้งานได้ สร้างทางลัดสำหรับเดสก์ท็อปและโปรแกรมข้ามแพลตฟอร์มโดยอัตโนมัติ พวกเขาเปิดใช้งานสภาพแวดล้อมและเริ่มแอปพลิเคชัน รองรับ pip

* สะดวกที่สุดสำหรับนักพัฒนา สะดวกเพียงพอสำหรับผู้ใช้ปลายทาง

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