2010-03-22 47 views
9

Xin chào các nhà phát triển phần mềm đồng nghiệp.Cách tạo ứng dụng nhúng và chạy mã Python mà không cần cài đặt Python cục bộ?

Tôi muốn phân phối chương trình C có thể viết được bằng cách nhúng trình thông dịch Python.
Chương trình C sử dụng Py_Initialize, PyImport_Import và vv để hoàn thành việc nhúng Python.

Tôi đang tìm kiếm một giải pháp mà tôi chỉ phân phối các thành phần sau:

  • chương trình thực thi của tôi và các thư viện của nó
  • thư viện Python (dll/như vậy)
  • một ZIP-file chứa tất cả các mô-đun và thư viện Python cần thiết.

Tôi làm cách nào để thực hiện việc này? Có một công thức từng bước cho điều đó không?

Giải pháp phải phù hợp cho cả Windows và Linux.

Xin cảm ơn trước.

+0

Tôi đã xóa câu trả lời của mình vì câu trả lời không được áp dụng. Bạn có thể muốn chỉnh sửa câu hỏi để rõ ràng rằng bạn đang nhúng Python vào ứng dụng C. – FogleBird

+1

Có thể liên quan: http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed –

Trả lời

1

Bạn đã xem Portable Python chưa? Không cần cài đặt gì cả. Chỉ cần sao chép các tệp được bao gồm để sử dụng trình thông dịch.

Chỉnh sửa: Đây là giải pháp chỉ dành cho Windows.

+0

Python di động cũng là một tìm kiếm khi tôi thực hiện nghiên cứu của mình. Nhưng đó không phải những gì tôi đang tìm kiếm. Không nên có bất kỳ sự phụ thuộc nào khác. – Robert

0

Bạn đã xem Embedding Python in Another Application trong tài liệu Python chưa?

Khi bạn có điều đó, bạn có thể sử dụng móc nhập (xem PEP 302) để có mô-đun tải mã Python nhúng của bạn từ bất kỳ địa điểm nào bạn chọn. Tuy nhiên, nếu bạn có tất cả mọi thứ trong một tệp zip, bạn có thể chỉ cần nhập mục đó vào sys.path.

+0

Ah, tôi nên làm mới các bình luận trước khi đăng ...! –

1

Tôi chỉ cần thử nghiệm tệp thực thi của mình trên máy tính chưa cài đặt Python và đã hoạt động.

Khi bạn liên kết Python với tệp thực thi (không có vấn đề gì nếu động hoặc tĩnh), tệp thực thi của bạn đã có chức năng ngôn ngữ Python cơ bản (toán tử, phương thức, cấu trúc cơ bản như chuỗi, danh sách, tuple, dict, v.v.) .

Sau đó, tôi cho phép setup.py của Python biên dịch phân phối nguồn Python qua python setup.py sdist --format=zip cho tôi một tệp ZIP mà tôi đặt tên pylib-2.6.4.zip.

bước tiếp theo của tôi là:

char pycmd[1000]; // temporary buffer for forged Python script lines 
... 
Py_NoSiteFlag=1; 
Py_SetProgramName(argv[0]); 
Py_SetPythonHome(directoryWhereMyOwnPythonScriptsReside); 
Py_InitializeEx(0); 

// forge Python command to set the lookup path 
// add the zipped Python distribution library to the search path as well 
snprintf(
    pycmd, 
    sizeof(pycmd), 
    "import sys; sys.path = ['%s/pylib-2.6.4.zip','%s']", 
    applicationDirectory, 
    directoryWhereMyOwnPythonScriptsReside 
); 

// ... and execute 
PyRun_SimpleString(pycmd); 

// now all succeeding Python import calls should be able to 
// find the other modules, especially those in the zipped library 

... 
0

Có một chương trình gọi là py2exe. Tôi không biết nếu nó chỉ có sẵn cho Windows. Ngoài ra, phiên bản mới nhất mà tôi đã sử dụng không bao gồm mọi thứ thành một tệp .exe. Nó tạo ra một loạt các thứ cần phân phối - một tệp zip, v.v.

+0

Tiêu đề có vẻ gây hiểu nhầm - Python được nhúng. Tôi không muốn có mã Python được nhúng trong tệp thi hành - tệp thực thi sẽ trở thành có thể viết được bằng cách được liên kết với Python. py2exe do đó không phải là giải pháp. – Robert

0

Tôi nghĩ rằng đây là câu trả lời bạn muốn Unable to get python embedded to work with zip'd library

Về cơ bản, bạn cần:

Py_NoSiteFlag=1; 
Py_SetProgramName(argv[0]); 
Py_SetPythonHome("."); 
Py_InitializeEx(0); 
PyRun_SimpleString("import sys"); 
PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib','python27.zip/site-packages']"); 

trong c/C++ mã của bạn để tải các thư viện chuẩn python.

Và trong python27.zip, tất cả mã nguồn .py của bạn được đặt tại python27.zip/Lib như được mô tả trong biến số sys.path.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan