2008-10-21 47 views
9

Một trong các mô-đun cho ứng dụng của tôi sử dụng các hàm từ tệp .pyd. Có một tùy chọn để loại trừ dlls (exclude_dlls) nhưng có một tùy chọn để bao gồm chúng không? Quá trình xây dựng dường như không sao chép tệp .pyd trong mô-đun của tôi mặc dù sao chép phần còn lại của tệp (.py). Tôi cũng cần bao gồm một .dll. Làm cách nào để lấy py2exe để bao gồm cả tệp .pyd và .dll?Bao gồm PYDs/DLLs trong py2exe builds

Trả lời

2

Nếu chúng không được phát hiện tự động, hãy thử sao chép thủ công chúng vào thư mục xây dựng tạm thời của py2exe. Họ sẽ được bao gồm trong thực thi cuối cùng.

+0

Có, nhưng lý tưởng là một phần của tập lệnh setup.py hoặc đặt trong tập lệnh batch của tôi để tạo tệp thực thi. – TheObserver

2

Bạn có thể thay đổi kịch bản thiết lập để sao chép các tập tin một cách rõ ràng:

script = "PyInvaders.py"  #name of starting .PY 
project_name = os.path.splitext(os.path.split(script)[1])[0] 
setup(name=project_name, scripts=[script]) #this installs the program 

#also need to hand copy the extra files here 
def installfile(name): 
    dst = os.path.join('dist', project_name) 
    print 'copying', name, '->', dst 
    if os.path.isdir(name): 
    dst = os.path.join(dst, name) 
    if os.path.isdir(dst): 
     shutil.rmtree(dst) 
    shutil.copytree(name, dst) 
    elif os.path.isfile(name): 
    shutil.copy(name, dst) 
    else: 
    print 'Warning, %s not found' % name 

pygamedir = os.path.split(pygame.base.__file__)[0] 
installfile(os.path.join(pygamedir, pygame.font.get_default_font())) 
installfile(os.path.join(pygamedir, 'pygame_icon.bmp')) 
for data in extra_data: 
    installfile(data) 

vv ... sửa đổi cho phù hợp với nhu cầu của bạn, tất nhiên.

2

Có lẽ bạn có thể sử dụng tùy chọn data_files để setup():

import glob 
setup(name='MyApp', 
     # other options, 
     data_files=[('.', glob.glob('*.dll')), 
        ('.', glob.glob('*.pyd'))], 
    ) 

data_files phải là một danh sách các hàng, trong đó mỗi tuple chứa:

  1. Các thư mục đích.
  2. Danh sách các tệp cần sao chép.

Điều này sẽ không đưa tệp vào library.zip, đây không phải là vấn đề đối với dll, nhưng tôi không biết về tệp pyd.

11

.pyd và .DLL khác ở đây, trong đó .pyd phải được tự động tìm thấy bởi mô-đun và bao gồm (miễn là bạn có tuyên bố "nhập" thích hợp) mà không cần phải làm gì cả. Nếu một trong những bị mất, bạn làm điều tương tự như nếu một tập tin .py đã bị mất (cả hai đều chỉ là mô-đun): sử dụng "bao gồm" tùy chọn cho các tùy chọn py2exe.

Kính ngắm sẽ không nhất thiết phải tìm phụ thuộc vào .DLLs (py2exe có thể phát hiện một số), vì vậy bạn có thể cần bao gồm rõ ràng những điều này, với tùy chọn 'data_files'.

Ví dụ, nơi bạn có hai .DLL's ('foo.dll' và 'bar.dll') để bao gồm, và ba .pyd's ('module1.pyd', 'module2.pyd' và 'module3. pyd ') để bao gồm:

setup(name='App', 
     # other options, 
     data_files=[('.', 'foo.dll'), ('.', 'bar.dll')], 
     options = {"py2exe" : {"includes" : "module1,module2,module3"}} 
    ) 
+2

Trong phiên bản hiện tại của py2exe, data_files sẽ trông giống như vậy: data_files = [(DIR, [FILE, FILE, FILE]), ...] –

+3

Khi tôi làm điều này, tôi cần sử dụng "include" thay vì "include "hoặc py2exe than phiền. – talljosh

+0

Tôi có cùng một vấn đề với việc tìm kiếm tệp pyd và tôi đã thử bao gồm tài nguyên bị thiếu nhưng py2exe vẫn không thể tìm thấy nó. –