Bagaimana membuat skrip Python dapat dijalankan agar dapat dijalankan tanpa ketergantungan APAPUN?

706

Saya sedang membangun aplikasi Python dan tidak ingin memaksa klien saya untuk menginstal Python dan modul.

Jadi, apakah ada cara untuk mengkompilasi skrip Python untuk menjadi executable mandiri?

Jeff
sumber
307
Bagian dari pertanyaan yang mengatakan "Saya tidak ingin memaksa klien saya untuk menginstal Python dan modul." Itu tidak mengatakan klien tidak bisa melakukannya, itu mengatakan pengembang tidak ingin meminta mereka untuk melakukannya. Tidak ada gunanya memperdebatkan hal ini di sini, karena klien tidak membaca SO untuk berbicara sendiri. Saya tidak ingin menginstal lingkungan pengembangan Flash hanya untuk menonton youtube, atau lingkungan pengembangan C hanya untuk bermain Sudoku, atau lingkungan pengembangan Python untuk menjalankan versi Angry Birds yang ditulis dengan Python. Untuk itulah runtime dapat didistribusikan kembali.
Dave

Jawaban:

243

Anda dapat menggunakan py2exe seperti yang sudah dijawab dan menggunakan cython untuk mengonversi .pyfile kunci Anda .pyc, file yang dikompilasi C, seperti .dlldi Windows dan .sodi linux, jauh lebih sulit untuk dikembalikan daripada file biasa .pyodan .pyc(dan juga mendapatkan kinerja!)

neurino
sumber
1
Terima kasih atas jawabannya. Saya telah mempertimbangkan Cython, tetapi tampaknya masih perlu Python untuk menjalankan executable yang dikompilasi. Apakah maksud Anda mengkompilasi skrip ke .pyc menggunakan Cython? (Saya tidak tahu apakah Cython memiliki fitur seperti itu)
Jeff
9
Maksud saya, Anda memiliki dua masalah : sumber tertutup dan tanpa deps. Untuk sumber tertutup kompilasi kode penting Anda dalam libs menggunakan Cython. Untuk no-deps gunakan py2exe dan buat file executable dengan .pyd (cython dikompilasi) di dalamnya.
neurino
7
Apa yang akan Anda lakukan tentang perpustakaan (numpy, scipy, matplotlib)? Sebagai contoh, bagaimana klien dapat menggunakan fungsi ginput () di matplotlib dari executable, tanpa menginstalnya di komputer mereka.
chimpsarehungry
@ chimpsarehungry bagaimana dengan tautan statis?
Braden Best
11
Rilis terakhir sepertinya pada tahun 2008, apakah ini masih dipertahankan?
Zitrax
302

Anda dapat menggunakan PyInstaller untuk mengemas program Python sebagai executable mandiri. Ini bekerja pada Windows, Linux, dan Mac.

PyInstaller Quickstart

Instal PyInstaller dari PyPI:

pip install pyinstaller

Buka direktori program Anda dan jalankan:

pyinstaller yourprogram.py

Ini akan menghasilkan bundel dalam subdirektori bernama dist.

Untuk panduan lebih rinci, lihat manual .

Rumple Stiltskin
sumber
10
Perlu dicatat bahwa pyinstaller dapat dikompilasi ke satu file .exe. Juga pada OS dijalankan, membuat yang executable, yaitu .exe ketika berjalan di Windows
Richard de Wit
2
@ ItayMoav-Malimovka Mereka bekerja dalam dukungan Python 3. Lihat github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS
3
Seperti yang dikatakan @GeenHenk, jika Anda "mengkompilasi" pada Windows, ia membuat exe, ingatlah bahwa Anda tidak dapat mengkompilasi untuk Windows (membuat exe) di Linux, atau membuat Linux dapat dijalankan pada Windows. Anda hanya dapat membuat executable dari platform yang Anda jalankan. (Di Linux Anda dapat menggunakan anggur untuk mengelabui ini)
PhoneixS
14
menggunakan 'pyinstaller' jauh lebih mudah daripada 'py2exe'. Ini menangani setiap dependensi termasuk numpy, panda, apa saja dan memberi Anda satu executable pada platform kerja!
aks
12
Sepertinya persis apa yang saya cari. Dan sekarang mendukung Python 3! Terima kasih :)
Daniel Gruszczyk
83

Anda mungkin ingin menyelidiki Nuitka . Dibutuhkan kode sumber python dan mengubahnya menjadi panggilan C ++ API. Kemudian dikompilasi menjadi biner yang dapat dieksekusi (ELF di Linux). Sudah ada selama beberapa tahun sekarang dan mendukung berbagai versi Python.

Anda mungkin juga akan mendapatkan peningkatan kinerja jika Anda menggunakannya. Direkomendasikan.

cdarke
sumber
5
Nuitka adalah alat yang luar biasa. Tidak perlu tidak menggunakannya. Saya hanya akan menunjukkan satu hal - ini tidak terbatas pada Linux saja - ini lintas platform - alasan lain mengapa menggunakannya.
sjaustirni
5
Nuitka bekerja pada Python 2.6, 2.7, 3.2, 3.3, dan 3.4, dan bersifat cross-platform: (Linux, FreeBSD, NetBSD, MacOS X, dan Windows (32/64 bit). Lainnya dapat bekerja juga. Arsitektur: x86, x86_64 (amd64), dan lengan. Arsitektur lain mungkin juga berfungsi, di luar kotak.)
Jonathan Hartley
Ini tidak didukung untuk yang terbaru 3.6 .. dan merupakan mimpi buruk untuk dipasang di windows
Tetora
Bekerja seperti pesona di macOS High Sierra + Python 3.5.2. Terima kasih!
Anthony L.
Apakah ini membuat eksekusi mandiri?
Suara
31

Saya ingin mengkompilasi beberapa informasi yang berguna tentang membuat file mandiri di windows menggunakan Python 2.7.

Saya telah menggunakan py2exe dan berfungsi, tapi saya punya beberapa masalah.

Alasan terakhir ini membuat saya mencoba PyInstaller http://www.pyinstaller.org/ .

Menurut saya, itu jauh lebih baik karena:

  • Lebih mudah digunakan.

Saya sarankan membuat file .bat dengan baris berikut misalnya (pyinstaller.exe harus di Windows Path):

pyinstaller.exe --onefile MyCode.py

Jadi, saya pikir, setidaknya untuk python 2.7, pilihan yang lebih baik dan lebih sederhana adalah PyInstaller.

Diego
sumber
3
The --onefilebendera tidak akan membantu Anda untuk membuatnya portabel di Windows, karena masih dieksekusi ingin link dengan api-ms-win-crt-runtime-l1-1-0.dllperpustakaan (atau / dan lain-lain) yang harus diinstal melalui vcredistpaket. Jadi ketergantungan masih ada dan harus diinstal sebelum dijalankan.
Andry
27

Ya, adalah mungkin untuk mengkompilasi skrip Python menjadi executable mandiri.

PyInstaller dapat digunakan untuk mengubah program Python menjadi executable yang berdiri sendiri, di bawah Windows , Linux , Mac OS X , FreeBSD , Solaris dan AIX . Ini adalah salah satu konverter yang direkomendasikan.

py2exe mengubah skrip Python menjadi hanya dapat dieksekusi di platform Windows.

Cython adalah kompiler statis untuk bahasa pemrograman Python dan bahasa pemrograman Cython yang diperluas.

mainkan
sumber
2
Terima kasih untuk ini. Saya menggunakan py2exe, dan tidak bisa membuat ikon berfungsi sama sekali. PyInstaller bekerja pertama kali, dan tampak hebat!
Chud37
Bisakah saya membuat eksekusi mandiri dari Windows untuk Linux dan macOS? Atau saya harus menginstal Linux dan macOS di VirtualBox? Saya tidak punya cukup ruang kosong di laptop saya.
8Observer8
1
Saya menemukan jawaban atas pertanyaan saya di dokumentasi di sini: pyinstaller.readthedocs.io/en/stable/…
8Observer8
26

Dan opsi ketiga adalah cx_Freeze, yaitu cross-platform.

Katriel
sumber
1
Di sini kita berada di Februari 2019 dan tidak ada cx_Freezerilis terdaftar di pypi sejak akhir 2017. Apakah proyek ini ditinggalkan?
user9074332
17

Anda mungkin menyukai py2exe . Anda juga akan menemukan info di sana untuk melakukannya di linux

pengguna237419
sumber
2
Tetapi Anda harus memberikannya paket semua opsi.
Jakob Bowyer
14

Gunakan py2exe .... gunakan di bawah ini mengatur file:

 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()
     )
Anand
sumber
Saya melakukan ini dan itu membuat file python27.dll dan masih diperlukan. Saya memindahkan file .exe dari folder yang menyimpan file python27.dll dan file .exe tidak lagi berjalan.
mjwrazor
Bisakah Anda menampilkan skrip seperti itu untuk Linux dan macOS? Saya ingin membuat file yang dapat dieksekusi mandiri dari Windows untuk Linux dan macOS.
8Observer8
13

Saya suka pyinstaller - terutama varian "berjendela":

pyinstaller --onefile --windowed myscript.py

Ini akan membuat satu file * .exe tunggal di dist / folder.

cslotty
sumber
11

Saya juga merekomendasikan pyinstaller untuk kompatibilitas yang lebih baik seperti python 2.3 - 2.7.
untuk py2exe , Anda harus memiliki python 2.6

yantaq
sumber
pyinstaller memiliki masalah impor. Sebagai contoh: dalam kasus saya, saya dalam DIR ~ / Documents / python101 / dan ex50_pycomp.py & ex50.py ini ada dalam dir ini. ex50_pycomp.py mengimpor ex50.py. Saya menjalankan pyinstaller ex50_pycomp.py dan saya melihat semua comp, diproduksi dist. Baik baik saja Saya cd ke dist / ex50_pycomp / dan menjalankan ex50_pycomp berfungsi. Setelah saya menempatkan ex50_pycom ini ke mesin virtual, maka ini mengatakan kesalahan impor dan di kotak linux lain ia mengatakan "-bash: ./ex_50_pycom: tidak dapat mengeksekusi file biner: kesalahan format Exec"
driven_spider
prob1: Saya menggunakan python2.7 tapi pyinstaller sedang berbicara dengan python3 python3 setup.py build python3 setup.py instal python3 Anda akan mendapatkan semua pkg_resources prob 3: jika menggunakan sys_path menjadi masalah maka berikan path Anda seperti pyinstaller ini --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: pyinstaller folder dist 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

Untuk skrip Python 3.2 satu-satunya pilihan adalah Cxfreeze. Bangun dari sumber kalau tidak tidak akan berhasil.

Untuk python 2.x saya sarankan pyinstaller karena dapat mengemas program python dalam satu executable, tidak seperti CxFreeze yang juga output library.

ravi.chunduru
sumber
6

py2exe akan membuat file exe yang Anda inginkan, tetapi Anda harus memiliki versi MSVCR90.dll yang sama pada mesin Anda akan menggunakan exe baru Anda. Lihat http://www.py2exe.org/index.cgi/Tutorial untuk info lebih lanjut.

setan
sumber
6

Anda dapat menemukan daftar utilitas distribusi yang terdaftar di @ https://wiki.python.org/moin/DistributionUtilities .

Saya menggunakan bbfreeze dan telah bekerja sangat baik (belum memiliki dukungan python 3).

Joe
sumber
stackoverflow.com/questions/33683133/... Saya menggunakan paket bbfreeze yang sangat bagus.
user914425
Apakah itu mengurus dependensi dan menginstal modul py yang relevan?
Volatil3
@ Volatil3 Ya, semua dependensi diurus. WRT untuk pemasangan modul pada sistem host - ada berbagai jenis kompilasi. BBfreeze akan mengkompilasi semuanya menjadi beberapa .sofile, atau menyalin file .egg secara langsung dan semuanya akan ada dalam satu direktori (atau sebagai file tunggal). Tidak diperlukan instalasi.
Joe
6
pyinstaller yourfile.py -F --onefile

Ini membuat file EXE mandiri di Windows. CATATAN PENTING: File exe akan dihasilkan di folder bernama 'dist'

Anda dapat menginstal pyinstaller menggunakan pip install PyInstaller

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

ShadyMBA
sumber
4

Tidak persis pengemasan kode python, tetapi sekarang ada juga pemarah dari google, yang mengubah kode menjadi Go. Itu tidak mendukung python C api, jadi itu mungkin tidak bekerja untuk semua proyek.

bentuk bebas
sumber
4

Menggunakan pyinstaller, saya menemukan metode yang lebih baik menggunakan cara pintas ke .exe daripada membuat --onefile. Bagaimanapun mungkin ada beberapa file data di sekitarnya dan jika Anda menjalankan aplikasi berbasis situs maka program Anda tergantung pada html, js, file css juga. Tidak ada gunanya memindahkan semua file ini di suatu tempat .. sebaliknya bagaimana jika kita memindahkan jalur kerja ke atas.

Buat pintasan ke exe, pindahkan di atas dan atur target dan jalur start-in seperti yang ditentukan, agar jalur relatif menuju ke 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\" Dapat mengganti nama pintasan ke apa pun sehingga mengubah nama menjadi "GTFS-Manager"
Sekarang ketika saya menggandakan -Klik pintasan, seolah-olah saya python-lari file! Saya menemukan pendekatan ini lebih baik daripada yang --onefilesebagai:

  1. Dalam kasus onefile, ada masalah dengan .dll yang hilang untuk win7 OS yang memerlukan beberapa instalasi sebelumnya dll. Menguap. Dengan build biasa dengan banyak file, tidak ada masalah seperti itu.
  2. Semua file yang digunakan skrip python saya (ini menyebarkan server web tornado dan membutuhkan seluruh file situs web freakin untuk berada di sana!) Tidak perlu dipindahkan ke mana pun: Saya cukup membuat pintasan di atas.
  3. Saya benar-benar dapat menggunakan folder yang persis sama ini di ubuntu (jalankan python3 myfile.py) dan windows (klik dua kali pintasan).
  4. Saya tidak perlu repot dengan peretasan file .spec yang terlalu rumit untuk memasukkan file data dll.

Oh, ingatlah untuk menghapus folder build setelah membangun, akan menghemat ukuran.

Nikhil VJ
sumber
Hai, baru saja memperbarui .. Saya memutuskan untuk melupakan kompresi UPX dan pergi --onefile akhirnya. Harus memilih satu, karena UPX saat ini memiliki bug dalam mengompresi DLL tertentu.
Nikhil VJ
3

Gunakan Cython untuk mengonversi ke c, kompilasi, dan tautkan dengan gcc. Yang lain bisa, buat fungsi inti di c (yang ingin Anda susah untuk balikkan), kompilasi dan gunakan dorongan python untuk mengimpor kode yang dikompilasi (ditambah Anda mendapatkan eksekusi kode yang jauh lebih cepat). kemudian gunakan alat apa pun yang disebutkan untuk mendistribusikan.

F.Moure
sumber
1

Saya diberitahu bahwa PyRun, https://www.egenix.com/products/python/PyRun/ , juga merupakan opsi.

Kraig Brockschmidt - MSFT
sumber
5
Tautan ke suatu solusi disambut baik, tetapi harap pastikan jawaban Anda bermanfaat tanpanya: tambahkan konteks di sekitar tautan sehingga teman-teman Anda akan mengetahui apa itu dan mengapa ada, lalu kutip bagian yang paling relevan dari halaman yang Anda tuju. menghubungkan kembali jika seandainya halaman target tidak tersedia. Jawaban yang sedikit lebih dari sebuah tautan dapat dihapus.
Petter Friberg
Opsi ini saat ini tidak mendukung Windows.
bob