Làm thế nào để tạo một tập lệnh Python độc lập có thể chạy được mà không cần phụ thuộc BẤT K ??


706

Tôi đang xây dựng một ứng dụng Python và không muốn buộc khách hàng của mình cài đặt Python và các mô-đun.

Vì vậy, có cách nào để biên dịch tập lệnh Python thành tệp thực thi độc lập không?


307
Một phần của câu hỏi có nội dung "Tôi không muốn buộc khách hàng của mình cài đặt Python và các mô-đun." Nó không nói rằng các khách hàng không thể làm điều đó, nó nói rằng nhà phát triển không muốn yêu cầu họ làm điều đó. Không có điểm nào để tranh luận về vấn đề này ở đây, vì các khách hàng không đọc SO để tự nói. Tôi không muốn cài đặt môi trường phát triển Flash chỉ để xem youtube hoặc môi trường phát triển C chỉ để chơi Sudoku hoặc môi trường phát triển Python để chạy phiên bản Angry Birds được viết bằng Python. Đó là những gì thời gian chạy lại có thể phân phối lại được.
Dave

Câu trả lời:


243

Bạn có thể sử dụng py2exe như đã trả lời và sử dụng cython để chuyển đổi các .pytệp chính của mình trong .pyc, các tệp được biên dịch C, như .dlltrong Windows và .sotrong linux, khó hoàn nguyên hơn nhiều so với các tệp thông thường .pyo.pyc(cũng có hiệu suất!)


1
Cảm ơn về câu trả lời. Tôi đã xem xét Cython, nhưng có vẻ như nó vẫn cần Python để chạy thực thi được biên dịch. Bạn có nghĩa là biên dịch tập lệnh thành .pyc bằng Cython? (Tôi không biết Cython có tính năng như vậy không)
Jeff

9
Ý tôi là bạn có hai vấn đề : nguồn đóng và không có deps. Đối với nguồn đóng, biên dịch mã quan trọng của bạn trong C libs bằng Cython. Đối với no-dep, sử dụng py2exe và tạo tệp thực thi với các tệp .pyd (cython đã biên dịch) bên trong.
neurino

7
Bạn sẽ làm gì về các thư viện (numpy, scipy, matplotlib)? Chẳng hạn, làm thế nào khách hàng có thể sử dụng hàm ginput () trong matplotlib từ tệp thực thi mà không cần cài đặt nó trên máy tính của họ.
chimpsarehungry

@chimpsarehungry còn liên kết tĩnh thì sao?
Braden hay nhất

11
Lần phát hành cuối cùng dường như là vào năm 2008, điều này có còn được duy trì?
Zitrax

302

Bạn có thể sử dụng PyInstaller để đóng gói các chương trình Python dưới dạng thực thi độc lập. Nó hoạt động trên Windows, Linux và Mac.

Khởi động nhanh PyInstaller

Cài đặt PyInstaller từ PyPI:

pip install pyinstaller

Chuyển đến thư mục của chương trình của bạn và chạy:

pyinstaller yourprogram.py

Điều này sẽ tạo ra gói trong thư mục con được gọi dist.

Để biết hướng dẫn chi tiết hơn, xem hướng dẫn .


10
Điều đáng chú ý là pyinstaller có thể biên dịch thành một tệp .exe duy nhất. Ngoài ra, nó chạy hệ điều hành nào, làm cho nó có thể thực thi được, tức là .exe khi chạy trên Windows
Richard de Wit

2
@ ItayMoav-Malimovka Họ đang làm việc trong sự hỗ trợ của Python 3. Xem github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS

3
Như @GeenHenk đã nói, nếu bạn "biên dịch" trên Windows, nó sẽ là một exe, hãy nhớ rằng bạn không thể biên dịch cho Windows (tạo một exe) trên Linux hoặc tạo một Linux có thể thực thi được trên Windows. Bạn chỉ có thể thực hiện việc thực thi nền tảng bạn đang chạy. (Trong Linux, bạn có thể sử dụng rượu vang để lừa điều này)
PhoneixS

14
sử dụng 'pyinstaller' dễ dàng hơn 'py2exe'. Nó chăm sóc tất cả các phụ thuộc bao gồm numpy, gấu trúc, bất cứ điều gì và cung cấp cho bạn một thực thi duy nhất trên nền tảng làm việc!
aks

12
Có vẻ như chính xác những gì tôi đang tìm kiếm. Và bây giờ hỗ trợ Python 3! Cảm ơn :)
Daniel Gruszchot

83

Bạn có thể muốn điều tra Nuitka . Nó lấy mã nguồn python và chuyển đổi nó thành các lệnh gọi API C ++. Sau đó, nó biên dịch thành một nhị phân thực thi (ELF trên Linux). Nó đã xuất hiện được vài năm và hỗ trợ nhiều phiên bản Python.

Bạn cũng có thể sẽ có được một cải tiến hiệu suất nếu bạn sử dụng nó. Đề nghị.


5
Nuitka là một công cụ tuyệt vời. Không cần không sử dụng nó. Tôi chỉ nêu ra một điều - nó không chỉ giới hạn ở Linux - đó là nền tảng chéo - một lý do khác khiến tôi sử dụng nó.
sjaustirni

5
Nuitka hoạt động trên Python 2.6, 2.7, 3.2, 3.3 và 3.4 và là nền tảng chéo: (Linux, FreeBSD, NetBSD, MacOS X và Windows (32/64 bit). Các cấu trúc khác cũng có thể hoạt động tốt. Kiến trúc: x86, x86_64 (amd64) và cánh tay. Các kiến ​​trúc khác cũng có thể hoạt động, ngoài hộp.)
Jonathan Hartley

Nó không được hỗ trợ cho 3.6 gần đây nhất và là một cơn ác mộng khi thiết lập trên các cửa sổ
Tetora

Hoạt động như một bùa mê trên macOS High Sierra + Python 3.5.2. Cảm ơn bạn!
Anthony L.

Điều này có tạo ra một thực thi độc lập?
lên tiếng

31

Tôi muốn biên dịch một số thông tin hữu ích về việc tạo các tệp độc lập trên windows bằng Python 2.7.

Tôi đã sử dụng py2exe và nó hoạt động, nhưng tôi đã gặp một số vấn đề.

Lý do cuối cùng này khiến tôi cố gắng PyInstaller http://www.pyinstaller.org/ .

Theo tôi, nó tốt hơn nhiều vì:

  • Nó dễ sử dụng hơn.

Tôi đề nghị tạo một tệp .bat với các dòng sau chẳng hạn (pyinstaller.exe phải có trong Windows Path):

pyinstaller.exe --onefile MyCode.py

Vì vậy, tôi nghĩ rằng, ít nhất là đối với python 2.7, một tùy chọn tốt hơn và đơn giản hơn là PyInstaller.


3
Các --onefilelá cờ sẽ không giúp bạn để làm cho nó di động trên Windows, bởi vì vẫn thực thi muốn liên kết với các api-ms-win-crt-runtime-l1-1-0.dllthư viện (hoặc / và những người khác) mà phải được cài đặt thông qua các vcredistgói. Vì vậy, một phụ thuộc vẫn còn đó và phải được cài đặt trước khi chạy.
Andry

27

Có, có thể biên dịch tập lệnh Python thành tệp thực thi độc lập.

PyInstaller có thể được sử dụng để chuyển đổi các chương trình Python thành các tệp thực thi độc lập, trong Windows , Linux , Mac OS X , FreeBSD , SolarisAIX . Đây là một trong những bộ chuyển đổi được đề nghị.

py2exe chuyển đổi các tập lệnh Python thành chỉ thực thi trong nền tảng Windows.

Cython là một trình biên dịch tĩnh cho cả ngôn ngữ lập trình Python và ngôn ngữ lập trình Cython mở rộng.


2
Cám ơn vì cái này. Tôi đã sử dụng py2exe và không thể làm cho các biểu tượng hoạt động được với nó. PyInstaller làm việc lần đầu tiên, và trông thật tuyệt!
Chud37

Tôi có thể tạo độc lập thực thi từ Windows cho Linux và macOS không? Hoặc tôi nên cài đặt Linux và macOS trên VirtualBox? Tôi không có đủ dung lượng trống trên máy tính xách tay của mình.
8Observer8

1
Tôi đã tìm thấy câu trả lời cho câu hỏi của mình trong tài liệu ở đây: pyinstaller.readthedocs.io/en/ sóng / bền
8Observer8

26

Và một lựa chọn thứ ba là cx_Freeze, đó là đa nền tảng.


1
Chúng tôi đang ở đây vào tháng 2 năm 2019 và không có cx_Freezebản phát hành nào được liệt kê trên pypi kể từ cuối năm 2017. Dự án này có bị bỏ không?
dùng9074332

17

bạn có thể thích py2exe . bạn cũng sẽ tìm thấy trong đó infos để làm điều đó trên linux


2
Nhưng bạn sẽ cần phải cung cấp cho nó tất cả các tùy chọn gói.
Jakob Bowyer

14

Sử dụng py2exe .... sử dụng bên dưới để thiết lập tệp:

 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()
     )

Tôi đã làm điều này và nó đã tạo ra một tập tin python27.dll và nó vẫn được yêu cầu. Tôi đã chuyển tệp .exe ra khỏi thư mục chứa tệp python27.dll và tệp .exe không còn chạy nữa.
mjwrazor

Bạn có thể hiển thị tập lệnh như vậy cho Linux và macOS không? Tôi muốn tạo các tệp thực thi độc lập từ Windows cho Linux và macOS.
8Observer8

13

Tôi thích pyinstaller - đặc biệt là biến thể "cửa sổ":

pyinstaller --onefile --windowed myscript.py

Nó sẽ tạo một tập tin * .exe duy nhất trong một thư mục dist /.


11

Tôi cũng khuyên dùng pyinstaller để tương thích ngược tốt hơn như python 2.3 - 2.7.
Đối với py2exe , bạn phải có python 2.6


pyinstaller có vấn đề nhập khẩu. Ví dụ: trong trường hợp của tôi, tôi đang ở trong TRỰC TIẾP ~ / Documents / python101 / và ex50_pycomp.py & ex50.py nằm trong thư mục này. ex50_pycomp.py nhập ex50.py. Tôi chạy pyinstaller ex50_pycomp.py và tôi thấy tất cả đã tuân thủ, được sản xuất. Tất cả đều tốt phải không? Tôi cd vào dist / ex50_pycomp / và chạy ex50_pycomp nó hoạt động. Khi tôi đặt ex50_pycom này vào một máy ảo, thì điều này báo lỗi nhập và trong một hộp linux khác, nó báo "-bash: ./ex_50_pycom: không thể thực thi tệp nhị phân: Lỗi định dạng Exec"
Driving_spider

prob1: Tôi đang sử dụng python2.7 nhưng pyinstaller đang nói chuyện với python3 python3 setup.py build python3 setup.py cài đặt python3 của bạn sẽ nhận được tất cả pkg_resours prob 3: nếu sử dụng sys_path sẽ trở thành vấn đề vì vậy hãy đưa đường dẫn của bạn như pyinstaller này - import = pkg_resource --onefile file.py --path = my_path rw-rw-r-- my_path: thư mục dist của python3 pyinstaller --hidden-import = pkg_resource --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.denty-py3.5.egg/my_folder -rw-rw-
r--

8

Đối với các kịch bản Python 3.2, sự lựa chọn duy nhất là Cxfreeze. Xây dựng nó từ các nguồn nếu không nó sẽ không hoạt động.

Đối với python 2.x tôi đề xuất pyinstaller vì nó có thể gói một chương trình python trong một tệp thực thi duy nhất, không giống như CxFreeze xuất ra các thư viện.



6

Bạn có thể tìm thấy danh sách các tiện ích phân phối được liệt kê @ https://wiki.python.org/moin/DistributionUtilities .

Tôi sử dụng bbfreeze và nó đã hoạt động rất tốt (chưa có hỗ trợ python 3).


stackoverflow.com/questions/33683133/ Tôi sử dụng gói bbfreeze rất đẹp.
dùng914425

Nó có quan tâm đến sự phụ thuộc và cài đặt các mô-đun py có liên quan không?
Volatil3

@ Volatil3 Có, tất cả các phụ thuộc được chăm sóc. WRT để cài đặt các mô-đun trên hệ thống máy chủ - có nhiều kiểu biên dịch khác nhau. Bbfreeze sẽ biên dịch mọi thứ thành nhiều .sotệp hoặc sao chép trực tiếp các tệp .egg và tất cả chúng sẽ có mặt trong một thư mục (hoặc dưới dạng một tệp). Không cần cài đặt.
Joe

6
pyinstaller yourfile.py -F --onefile

Điều này tạo ra một tệp EXE độc lập trong Windows LƯU Ý QUAN TRỌNG: Tệp exe sẽ được tạo trong một thư mục có tên 'dist'

bạn có thể cài đặt pyinstaller bằng pip install PyInstaller

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


4

Không chính xác là một bao bì của mã python, nhưng hiện tại cũng có sự cằn nhằn từ google, nơi chuyển mã thành Go. Nó không hỗ trợ api python C, vì vậy nó có thể không hoạt động cho tất cả các dự án.


4

Sử dụng pyinstaller, tôi tìm thấy một phương pháp tốt hơn bằng cách sử dụng phím tắt đến .exe thay vì thực hiện --onefile. Dù sao, có thể có một số tệp dữ liệu xung quanh và nếu bạn đang chạy một ứng dụng dựa trên trang web thì chương trình của bạn cũng phụ thuộc vào các tệp html, js, css. Không có điểm nào trong việc di chuyển tất cả các tệp này ở đâu đó .. thay vào đó, nếu chúng ta di chuyển đường dẫn làm việc lên.

Tạo một lối tắt đến exe, di chuyển nó lên trên cùng và đặt các đường dẫn đích và khởi động theo chỉ định, để có các đường dẫn tương đối đi tới thư mục dist \: Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" Có thể đổi tên lối tắt thành bất cứ thứ gì để đổi tên thành "GTFS-Manager"
Bây giờ khi tôi nhân đôi -nhấp vào phím tắt, như thể tôi trăn-chạy tệp! Tôi thấy cách tiếp cận này tốt hơn phương pháp --onefilenhư:

  1. Trong trường hợp của onefile, có một vấn đề bị thiếu đối với hệ điều hành win7 cần cài đặt trước, v.v. Ngáp. Với bản dựng thông thường với nhiều tệp, không có vấn đề như vậy.
  2. Tất cả các tệp mà tập lệnh python của tôi sử dụng (đang triển khai một máy chủ web lốc xoáy và cần một tập tin có giá trị toàn bộ trang web của freakin ở đó!) Không cần phải di chuyển bất cứ nơi nào: Tôi chỉ cần tạo lối tắt ở trên cùng.
  3. Tôi thực sự có thể sử dụng chính thư mục này trong ubfox (chạy python3 myfile.py) và windows (bấm đúp vào phím tắt).
  4. Tôi không cần bận tâm đến việc hack tệp .spec quá phức tạp để bao gồm các tệp dữ liệu, v.v.

Oh, hãy nhớ xóa thư mục xây dựng sau khi xây dựng, sẽ tiết kiệm kích thước.


Xin chào, chỉ cần cập nhật .. Tôi đã quyết định từ bỏ nén UPX và đi theo cách --onefile cuối cùng. Phải chọn một, vì UPX hiện có lỗi trong việc nén một DLL cụ thể.
Nikhil VJ

3

Sử dụng Cython để chuyển đổi sang c, biên dịch và liên kết với gcc. Một cách khác có thể là, tạo các hàm cốt lõi trong c (những hàm bạn muốn làm khó để đảo ngược), biên dịch chúng và sử dụng python boost để nhập mã được biên dịch (cộng với bạn có được thực thi mã nhanh hơn nhiều). sau đó sử dụng bất kỳ công cụ được đề cập để phân phối.


1

Tôi đã nói rằng PyRun, https://www.egenix.com/products/python/PyRun/ , cũng là một tùy chọn.


5
Liên kết đến một giải pháp được hoan nghênh, nhưng vui lòng đảm bảo câu trả lời của bạn hữu ích mà không cần đến nó: thêm ngữ cảnh xung quanh liên kết để người dùng của bạn sẽ có ý tưởng về nó là gì và tại sao lại có, sau đó trích dẫn phần có liên quan nhất của trang bạn ' liên kết lại trong trường hợp trang đích không có sẵn. Câu trả lời ít hơn một liên kết có thể bị xóa.
Petter Friberg

Tùy chọn này hiện không hỗ trợ Windows.
bob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.