2009-02-15 37 views
11

Có cách nào sử dụng py2exe hoặc một số phương pháp khác để tạo tệp dll thay vì tệp exe?py2exe để tạo dll?

Tôi muốn cơ bản tạo một dll win32 bình thường với các hàm bình thường nhưng các hàm này sẽ được mã hóa bằng python thay vì C++.

Trả lời

6

Tôi nghĩ rằng bạn có thể giải quyết điều này bằng cách thực hiện một số hack:

  • Hãy nhìn vào các mô-đun zipextimporter trong py2exe. Nó giúp với việc nhập khẩu các tập tin pyd từ một zip.
  • Sử dụng, bạn có thể tải tệp đầu ra của py2exe trong ứng dụng/dll của bạn bằng cách sử dụng python-api nguyên. (Sử dụng boost :: python nếu bạn có thể và muốn)
  • Và vì tệp đầu ra của py2exe là một tệp nén, bạn có thể đính kèm nó ở cuối dll của bạn, làm cho toàn bộ nội dung tích hợp hơn. (Thủ thuật cũ cũng hoạt động với các tệp jar.)

Không được thử nghiệm, nhưng tôi nghĩ lý thuyết là âm thanh.

Về cơ bản, bạn thực hiện lại hàm main của tệp thực thi của py2exe() trong dll của bạn.

+0

py2exe có 1 đường dẫn đầu ra mã, chính(). Bạn có bất kỳ suy nghĩ về một cách để xác định các chức năng xuất khẩu/lớp học với mã chỉ python? Giả sử tôi đã thực hiện một số loại tiện ích tương tự py2dll –

+0

No. Tôi không nghĩ rằng bạn có thể làm điều đó mà không cần viết một số C.Tôi đã nghĩ rằng bạn muốn chạy py2exe như bình thường, và sử dụng thư viện đầu ra của nó, nhưng mã dll của riêng bạn, trong đó xuất khẩu một chức năng 'my_pymain' mà làm một cái gì đó tương tự như thực thi py2exe của. Bạn sẽ có thể ăn cắp mã đó từ py2exe. – Macke

4

Tôi không biết py2exe có thể làm điều đó, vì tôi tin rằng nó không thực sự tạo biểu tượng đối tượng ra khỏi mã Python của bạn, nhưng chỉ nhúng mã byte đã biên dịch trong tệp thực thi với thời gian chạy Python).

Tạo thư viện gốc có thể yêu cầu nhiều công việc hơn (để xác định giao diện C/C++ cho mọi thứ) với API Python-C. Nó có thể được phần nào dễ dàng hơn bằng cách sử dụng Elmer cho điều đó.

5

Tôi nghi ngờ rằng py2exe thực hiện điều này, vì nó được kiến ​​trúc xung quanh việc cung cấp một bootstrapping .exe để đưa ra trình thông dịch python và chạy nó.

Nhưng tại sao không chỉ nhúng Python trong mã C và biên dịch mã đó dưới dạng DLL?

0

Có vẻ như nó có thể tạo ra một DLL COM từ py2exe:

http://www.py2exe.org/index.cgi/Py2exeAndCtypesComDllServer

23  my_com_server_target = Target(
    24  description = "my com server", 
    25  # use module name for ctypes.com dll server 
    26  modules = ["dir.my_com_server"], 
    27  # the following line embeds the typelib within the dll 
    28  other_resources = [("TYPELIB", 1, open(r"dir\my_com_server.tlb", "rb").read())], 
    29  # we only want the inproc (dll) server 
    30  create_exe = False 
    31 ) 
1

Đối với hậu thế, tôi đã có thể sử dụng Elmer để tạo ra thành công một DLL có thể sử dụng thời gian gần đây. Trang web của họ has an example of building a DLL wrapper that loads python code. Nó là khá mát mẻ bởi vì bạn có thể thay đổi mã python trên bay để thay đổi hành vi DLL để gỡ lỗi.

Thật không may, đối với tôi, tôi muốn một DLL di động có thể hoạt động mà không cần cài đặt python. Phần đó không hoàn toàn không hoạt động. Thay vì lặp lại tất cả các bước, đây là liên kết đến câu trả lời với các bước tôi đã thực hiện: https://stackoverflow.com/a/24811840/3841168. Tôi đã phải phân phối python27.dll, elmer.dll và một vài .pyd cùng với .dll của tôi; một thời gian chạy .net thích hợp cũng là cần thiết vì python27.dll thường không được liên kết tĩnh. Có thể có một số cách xung quanh bao gồm cả một loạt các dll của, nhưng tôi không nhớ phân phối nhiều DLL, vì vậy tôi đã không đào sâu vào nó quá nhiều.

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