วิธีการทำให้สคริปต์ Python ทำงานได้โดยไม่ต้องพึ่งพาใด ๆ


707

ฉันกำลังสร้างแอปพลิเคชัน Python และไม่ต้องการบังคับให้ลูกค้าของฉันติดตั้ง Python และโมดูล

ดังนั้นจะมีวิธีการรวบรวมสคริปต์ Python เพื่อให้สามารถทำงานได้แบบสแตนด์อโลนหรือไม่?


307
ส่วนหนึ่งของคำถามที่ระบุว่า "ฉันไม่ต้องการบังคับให้ลูกค้าติดตั้ง Python และโมดูล" ไม่ได้บอกว่าลูกค้าทำไม่ได้ แต่บอกว่านักพัฒนาไม่ต้องการให้ลูกค้าทำ ไม่มีจุดโต้วาทีในจุดนี้เพราะลูกค้าไม่ได้อ่านดังนั้นจะพูดเพื่อตัวเอง ฉันไม่ต้องการติดตั้งสภาพแวดล้อมการพัฒนา Flash เพียงเพื่อดู youtube หรือสภาพแวดล้อมการพัฒนา C เพื่อเล่น Sudoku หรือสภาพแวดล้อมการพัฒนา Python เพื่อเรียกใช้ Angry Birds รุ่นที่เขียนใน Python นั่นคือสิ่งที่แจกจ่ายซ้ำสำหรับ
เดฟ

คำตอบ:


243

คุณสามารถใช้py2exeตามที่ได้ตอบไปแล้วและใช้cythonเพื่อแปลง.pyไฟล์คีย์ของคุณในไฟล์ที่.pycคอมไพล์ด้วย C เช่น.dllใน Windows และ.soใน linux ซึ่งยากต่อการย้อนกลับมากกว่าไฟล์ทั่วไป.pyoและ.pycไฟล์ (และยังเพิ่มประสิทธิภาพ!)


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

9
ฉันหมายความว่าคุณมีปัญหาสองประการ : แหล่งที่มาปิดและไม่มี dep - สำหรับแหล่งปิดรวบรวมรหัสสำคัญของคุณใน C libs โดยใช้ Cython สำหรับ no-deps ให้ใช้ py2exe และสร้างไฟล์ปฏิบัติการด้วย. pyd (cython คอมไพล์) ภายในไฟล์
neurino

7
คุณจะทำอะไรเกี่ยวกับห้องสมุดต่าง ๆ (numpy, scipy, matplotlib) ตัวอย่างเช่นลูกค้าจะสามารถใช้ฟังก์ชัน ginput () ใน matplotlib จากไฟล์ที่เรียกทำงานได้อย่างไรโดยไม่ต้องติดตั้งลงในคอมพิวเตอร์
chimpsarehungry

@chimpsarehungry แล้วการเชื่อมโยงแบบคงที่ล่ะ
Braden ที่ดีที่สุด

11
รุ่นล่าสุดดูเหมือนจะเป็นในปี 2008 นี้ยังคงอยู่หรือไม่?
Zitrax

302

คุณสามารถใช้PyInstallerเพื่อทำแพ็กเกจโปรแกรม Python เป็นไฟล์ปฏิบัติการแบบสแตนด์อโลน มันทำงานบน Windows, Linux และ Mac

PyInstaller Quickstart

ติดตั้ง PyInstaller จาก PyPI:

pip install pyinstaller

ไปที่ไดเรกทอรีของโปรแกรมและเรียกใช้:

pyinstaller yourprogram.py

distนี้จะสร้างมัดในไดเรกทอรีย่อยที่เรียกว่า

สำหรับคำแนะนำรายละเอียดเพิ่มเติมโปรดดูที่คู่มือ


10
เป็นที่น่าสังเกตว่า pyinstaller สามารถคอมไพล์ไฟล์. exe ไฟล์เดียวได้ นอกจากนี้ในวันที่ OS ที่มีการเรียกใช้ทำให้ที่ปฏิบัติการเช่น .exe เมื่อทำงานบน Windows
ริชาร์ดเดอวิทย์

2
@ ItayMoav-Malimovka พวกเขากำลังทำงานในการสนับสนุนของงูหลาม 3. เห็นgithub.com/pyinstaller/pyinstaller/tree/python3
PhoneixS

3
ดังที่ @GeenHenk กล่าวว่าหากคุณ "คอมไพล์" บน Windows มันทำให้เป็น exe โปรดทราบว่าคุณไม่สามารถคอมไพล์สำหรับ Windows (สร้าง exe) บน Linux หรือสร้างไฟล์ Linux ที่ทำงานได้บน Windows คุณสามารถทำให้ปฏิบัติการของแพลตฟอร์มที่คุณกำลังทำงานเท่านั้น (ใน Linux คุณสามารถใช้ไวน์เพื่อหลอกลวงได้)
PhoneixS

14
การใช้ 'pyinstaller' นั้นง่ายกว่า 'py2exe' มันจะดูแลทุกการพึ่งพารวมถึง numpy, pandas, อะไรและให้คุณปฏิบัติการเดียวบนแพลตฟอร์มการทำงาน!
aks

12
ดูเหมือนว่าสิ่งที่ฉันกำลังมองหา และตอนนี้รองรับ Python 3! ขอบคุณ :)
Daniel Gruszczyk

83

คุณอาจต้องการที่จะตรวจสอบ Nuitka ใช้ไพ ธ อนซอร์สโค้ดแล้วแปลงเป็น C ++ API call จากนั้นจะรวบรวมเป็นไบนารี่ที่สามารถใช้งานได้ (ELF บน Linux) เป็นเวลาไม่กี่ปีที่ผ่านมาและรองรับ Python เวอร์ชั่นต่างๆ

คุณอาจจะได้รับการปรับปรุงประสิทธิภาพหากคุณใช้มัน แนะนำ


5
Nuitka เป็นเครื่องมือที่ยอดเยี่ยม ไม่จำเป็นต้องไม่ใช้มัน ฉันจะชี้ให้เห็นสิ่งหนึ่งเท่านั้น - มันไม่ได้ จำกัด อยู่ที่ลินุกซ์เท่านั้น - มันเป็นแบบข้ามแพลตฟอร์ม - อีกเหตุผลที่จะใช้มัน
sjaustirni

5
Nuitka ทำงานบน Python 2.6, 2.7, 3.2, 3.3 และ 3.4 และข้ามแพลตฟอร์ม: (Linux, FreeBSD, NetBSD, MacOS X และ Windows (32/64 บิต) อื่น ๆ อาจทำงานได้เช่นกันสถาปัตยกรรม: x86, x86_64 (amd64) และแขนสถาปัตยกรรมอื่น ๆ อาจใช้งานได้เช่นกัน)
Jonathan Hartley

ไม่รองรับ 3.6 .. ล่าสุดและเป็นฝันร้ายสำหรับการตั้งค่าบนหน้าต่าง
Tetora

ทำงานได้อย่างมีเสน่ห์บน macOS High Sierra + Python 3.5.2 ขอบคุณ!
Anthony L.

สิ่งนี้จะสร้างไฟล์ปฏิบัติการแบบสแตนด์อโลนหรือไม่?
เสียง

31

ฉันต้องการรวบรวมข้อมูลที่เป็นประโยชน์เกี่ยวกับการสร้างไฟล์แบบสแตนด์อโลนบน windows โดยใช้ Python 2.7

ฉันใช้py2exeและใช้งานได้ แต่ฉันมีปัญหา

  • มันแสดงให้เห็นปัญหาบางอย่างสำหรับการสร้างไฟล์เดียวใน Windows 64 บิต: การใช้ bundle_files = 1 กับ py2exe ไม่ทำงาน ;

  • มีความจำเป็นต้องสร้างไฟล์ setup.py เพื่อให้มันใช้งานได้ http://www.py2exe.org/index.cgi/Tutorial#Step2 ;

  • ฉันมีปัญหากับการพึ่งพาที่คุณต้องแก้ไขโดยการนำเข้าแพ็คเกจในไฟล์ติดตั้ง;

  • ฉันไม่สามารถทำงานร่วมกับ PyQt ได้

เหตุผลสุดท้ายนี้ทำให้ผมลองPyInstaller http://www.pyinstaller.org/

ในความคิดของฉันมันจะดีกว่ามากเพราะ:

  • มันใช้งานง่ายกว่า

ฉันขอแนะนำให้สร้างไฟล์. bat ด้วยบรรทัดต่อไปนี้เช่น (pyinstaller.exe ต้องอยู่ใน Windows Path):

pyinstaller.exe --onefile MyCode.py
  • คุณสามารถสร้างไฟล์เดียวท่ามกลางตัวเลือกอื่น ๆ ( https://pyinstaller.readthedocs.io/en/stable/usage.html#options )

  • ฉันมีเพียงหนึ่งปัญหาโดยใช้ PyInstaller และแพคเกจ multiprocessing ที่ถูกแก้ไขได้โดยใช้สูตรนี้: https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing

ดังนั้นฉันคิดว่าอย่างน้อยสำหรับ python 2.7 ตัวเลือกที่ดีกว่าและง่ายกว่าคือ PyInstaller


3
การ--onefileตั้งค่าสถานะจะไม่ช่วยให้คุณพกพาได้บน Windows เนื่องจากไฟล์ปฏิบัติการยังต้องการเชื่อมโยงกับapi-ms-win-crt-runtime-l1-1-0.dllไลบรารี (หรือ / และอื่น ๆ ) ซึ่งจะต้องติดตั้งผ่านvcredistแพ็คเกจ ดังนั้นการพึ่งพายังคงมีและจะต้องติดตั้งก่อนที่จะเรียกใช้
Andry

27

ใช่เป็นไปได้ที่จะรวบรวมสคริปต์ Python ในการปฏิบัติการแบบสแตนด์อโลน

PyInstallerสามารถใช้ในการแปลงโปรแกรมหลามเข้า executables แบบสแตนด์อะโลนภายใต้ของ Windows , Linux , Mac OS X , FreeBSD , SolarisและAIX มันเป็นหนึ่งในตัวแปลงที่แนะนำ

py2exeแปลงสคริปต์ Python เป็นไฟล์ปฏิบัติการในแพลตฟอร์ม Windows เท่านั้น

Cythonเป็นคอมไพเลอร์แบบคงที่สำหรับทั้งภาษาการเขียนโปรแกรม Python และภาษาการเขียนโปรแกรมแบบ Cython


2
ขอบคุณสำหรับสิ่งนี้. ฉันใช้ py2exe และไม่สามารถใช้งานไอคอนได้เลย PyInstaller ทำงานครั้งแรกและดูดีมาก!
Chud37

ฉันสามารถสร้างไฟล์ปฏิบัติการแบบสแตนด์อโลนจาก Windows สำหรับ Linux และ macOS ได้หรือไม่ หรือฉันควรติดตั้ง Linux และ macOS บน VirtualBox? ฉันมีพื้นที่ว่างบนแล็ปท็อปของฉันไม่เพียงพอ
8Observer8

1
ฉันพบคำตอบสำหรับคำถามของฉันในเอกสารประกอบที่นี่: pyinstaller.readthedocs.io/en/stable/ …
8Observer8

26

และตัวเลือกที่สามคือcx_Freezeซึ่งเป็นแพลตฟอร์มข้าม


1
เราอยู่ที่นี่ในเดือนกุมภาพันธ์ 2019 และไม่มีการcx_Freezeเผยแพร่ใน pypi ตั้งแต่ปลายปี 2560 โครงการนี้ถูกยกเลิกหรือไม่
user9074332

17

คุณอาจชอบpy2exe คุณจะพบว่ามี infos สำหรับการทำมันบน linux


2
แต่คุณจะต้องให้มันตัวเลือกทั้งหมด
Jakob Bowyer

14

ใช้ py2exe .... ใช้ไฟล์ติดตั้งด้านล่าง:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )

ฉันทำสิ่งนี้และสร้างไฟล์ python27.dll และยังจำเป็น ฉันย้ายไฟล์. exe ออกจากโฟลเดอร์ที่ถือไฟล์ python27.dll และไฟล์. exe ไม่ทำงานอีกต่อไป
mjwrazor

คุณสามารถแสดงสคริปต์ดังกล่าวสำหรับ Linux และ macOS ได้หรือไม่ ฉันต้องการสร้างไฟล์ปฏิบัติการแบบสแตนด์อโลนจาก Windows สำหรับ Linux และ macOS
8Observer8

13

ฉันชอบpyinstaller - โดยเฉพาะตัวแปร "windowed":

pyinstaller --onefile --windowed myscript.py

มันจะสร้างไฟล์ * .exe หนึ่งไฟล์ในโฟลเดอร์ / dist


11

ฉันยังแนะนำ pyinstaller สำหรับความเข้ากันได้ย้อนหลังที่ดีกว่าเช่น python 2.3 - 2.7
สำหรับpy2exeคุณต้องมี python 2.6


pyinstaller มีปัญหาการนำเข้า ตัวอย่างเช่น: ในกรณีของฉันฉันอยู่ใน DIR ~ / Documents / python101 / และ ex50_pycomp.py & ex50.py อยู่ใน dir นี้ ex50_pycomp.py การนำเข้า ex50.py ฉันรัน pyinstaller ex50_pycomp.py และฉันเห็นทุกอย่างถูกต้อง ถูกต้องหรือไม่ ฉัน cd ลงใน dist / ex50_pycomp / และเรียกใช้ ex50_pycomp มันใช้งานได้ เมื่อฉันใส่นี้ ex50_pycom เข้าไปเวอร์ชวลแมชีนแล้วนี้กล่าวว่าข้อผิดพลาดและนำเข้าในกล่องลินุกซ์อื่น ๆ อีกว่า "ทุบตี: ./ex_50_pycom: ไม่สามารถเรียกใช้ไฟล์ไบนารี: ข้อผิดพลาดรูปแบบ Exec"
driven_spider

prob1: ฉันใช้ python2.7 แต่ pyinstaller กำลังคุยกับ python3 python3 setup.py build python3 setup.py ติดตั้ง python3 ของคุณจะได้รับ pkg_resources ทั้งหมด prob 3: ถ้าใช้ sys_path กลายเป็นปัญหาดังนั้นให้พา ธ ของคุณเช่น pyinstaller นี้ --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: pyinstaller โฟลเดอร์ส่วนท้ายของ python3 --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
driven_spider

8

สำหรับสคริปต์ Python 3.2 ทางเลือกเดียวคือ Cxfreeze สร้างจากแหล่งอื่นมิฉะนั้นจะไม่ทำงาน

สำหรับ python 2.x ฉันขอแนะนำให้ pyinstaller เพราะมันสามารถทำแพ็คเกจโปรแกรมไพ ธ อนได้ในการปฏิบัติการครั้งเดียวซึ่งแตกต่างจาก CxFreeze ซึ่งเอาท์พุทยังไลบรารี่


7
pyinstaller yourfile.py -F --onefile

สิ่งนี้จะสร้างไฟล์ EXE แบบสแตนด์อโลนใน Windows หมายเหตุสำคัญ: ไฟล์ exe จะถูกสร้างขึ้นในโฟลเดอร์ที่ชื่อว่า 'dist'

คุณสามารถติดตั้ง pyinstaller โดยใช้ pip install PyInstaller

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่



6

คุณสามารถหารายชื่อของสาธารณูปโภคกระจายจดทะเบียน @ https://wiki.python.org/moin/DistributionUtilities

ฉันใช้bbfreezeและใช้งานได้ดีมาก (แต่ก็ยังรองรับ python 3 ด้วย)


stackoverflow.com/questions/33683133/…ฉันใช้ bbfreeze แพ็คเกจที่ดีมาก
user914425

ดูแลการพึ่งพาและติดตั้งโมดูล py ที่เกี่ยวข้องหรือไม่
Volatil3

@ Volatil3 ใช่การอ้างอิงทั้งหมดได้รับการดูแล WRT สำหรับการติดตั้งโมดูลบนระบบโฮสต์ - มีการรวบรวมหลายแบบ bbfreeze จะรวบรวมทุกอย่างเป็น.soไฟล์หลาย ๆไฟล์หรือคัดลอกไฟล์ .egg โดยตรงและพวกเขาทั้งหมดจะปรากฏในไดเรกทอรีเดียว (หรือเป็นไฟล์เดียว) ไม่จำเป็นต้องติดตั้ง
Joe

4

ไม่ว่าบรรจุภัณฑ์ของรหัสหลาม แต่มีตอนนี้ยังไม่พอใจจาก Google ซึ่ง transpiles รหัสที่จะไป มันไม่รองรับ python C api ดังนั้นมันอาจไม่ทำงานสำหรับทุกโครงการ


4

ใช้ pyinstaller ผมพบว่าวิธีที่ดีกว่าใช้ทางลัดไปที่ exe --onefileมากกว่าทำ อย่างไรก็ตามอาจมีไฟล์ข้อมูลอยู่รอบ ๆ และหากคุณใช้งานแอพตามไซต์โปรแกรมของคุณก็ขึ้นอยู่กับไฟล์ html, js, css ด้วย ไม่มีจุดในการย้ายไฟล์ทั้งหมดเหล่านี้ที่ไหนสักแห่ง .. จะเกิดอะไรขึ้นถ้าเราย้ายเส้นทางการทำงานขึ้นมา

สร้างทางลัดไปยัง exe ย้ายที่ด้านบนและตั้งค่าเส้นทางและเส้นทางเริ่มต้นตามที่ระบุเพื่อให้เส้นทางสัมพัทธ์ไปที่ dist \ folder: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" สามารถเปลี่ยนชื่อทางลัดเป็นสิ่งใดก็ได้ดังนั้นเปลี่ยนชื่อเป็น "GTFS-Manager"
ตอนนี้เมื่อฉันสองครั้ง - คลิกทางลัดราวกับว่าฉัน python-run ไฟล์! ฉันพบวิธีการนี้ดีกว่าวิธีการ--onefileหนึ่งดังนี้:

  1. ในกรณีของ onefile มีปัญหากับ. dll จะหายไปสำหรับระบบปฏิบัติการ win7 ซึ่งต้องมีการติดตั้งมาก่อนและอื่น ๆ ด้วยการสร้างตามปกติที่มีหลายไฟล์จึงไม่มีปัญหาดังกล่าว
  2. ไฟล์ทั้งหมดที่สคริปต์ python ของฉันใช้ (เป็นการปรับใช้เว็บเซิร์ฟเวอร์พายุทอร์นาโดและต้องการเว็บไซต์ที่มีค่าของไฟล์ทั้งหมดอยู่ที่นั่น!) ไม่จำเป็นต้องย้ายไปที่ไหน: ฉันแค่สร้างทางลัดที่ด้านบน
  3. จริง ๆ แล้วฉันสามารถใช้โฟลเดอร์เดียวกันนี้ใน ubuntu (รัน python3 myfile.py) และ windows (ดับเบิลคลิกที่ทางลัด)
  4. ฉันไม่จำเป็นต้องกังวลกับการแฮ็คไฟล์. spec ที่ซับซ้อนเกินไปที่จะรวมไฟล์ข้อมูล ฯลฯ

โอ้โปรดอย่าลืมลบโฟลเดอร์ออกหลังจากสร้างแล้วจะบันทึกตามขนาด


สวัสดีเพิ่งอัปเดต .. ฉันตัดสินใจสละการบีบอัด UPX และไปที่ --onefile ในที่สุด ต้องเลือกอย่างใดอย่างหนึ่งเนื่องจาก UPX ในปัจจุบันมีข้อผิดพลาดในการบีบอัด DLL เฉพาะ
Nikhil VJ

3

ใช้ Cython เพื่อแปลงเป็น c, คอมไพล์และเชื่อมโยงกับ gcc อีกอย่างคือทำให้ฟังก์ชั่นหลักใน c (อันที่คุณต้องการทำให้ยากที่จะย้อนกลับ) รวบรวมและใช้การเพิ่มหลามเพื่อนำเข้ารหัสที่คอมไพล์แล้ว จากนั้นใช้เครื่องมือใด ๆ ที่กล่าวถึงเพื่อแจกจ่าย


1

ฉันบอกว่า PyRun https://www.egenix.com/products/python/PyRun/เป็นตัวเลือกเช่นกัน


5
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มี: เพิ่มบริบทรอบลิงก์เพื่อให้ผู้ใช้เพื่อนของคุณมีความคิดว่ามันคืออะไรและเพราะเหตุใดจึงอยู่ที่นั่น กำลังลิงก์ไปยังในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่น้อยกว่าลิงก์อาจถูกลบ
Petter Friberg

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