2012-08-03 40 views
12

này được đưa ra khá một vài lần trên danh sách cx_Freeze gửi thưDi chuyển tất cả các DLL và PYD đến một thư mục con với cx_Freeze

(xem

cx_Freeze and moving files around

Creating fewer files when freezing a Python application

cx_freeze python single file? )

và dường như tôi thích nó phải là một bản sửa lỗi đơn giản, nhưng tôi không thể thấy cách bắt đầu.

Tôi có ứng dụng python phụ thuộc vào scipy, wxpython, gumpy và một loạt các gói khác mà mỗi gói có rất nhiều thư viện được liên kết động. Thư mục thực thi chính được rất lộn xộn với các tệp PYD và DLL và thật khó để tìm thấy tệp thực thi trong tất cả các tệp. Người dùng của tôi không đặc biệt hiểu biết về máy tính, vì vậy sự rõ ràng là rất quan trọng.

Tôi không yêu cầu một tệp thực thi duy nhất như về mặt lý thuyết có thể được tạo bởi bbfreeze. Tôi thích cách các tập tin setup.py của distutils làm việc với cx_Freeze và theo cách khác cx_Freeze là khá nhiều rực rỡ.

Tất cả những gì tôi muốn là cách dọn dẹp thư mục thực thi chính. Tôi sẽ hoàn toàn hài lòng với việc di chuyển các tệp DLL theo cách thủ công vào một thư mục freeze_libs hoặc một cái gì đó và sau đó nhích đường dẫn tải thư viện được chia sẻ để giúp nó tìm các thư viện động nếu có thể. Hay đại loại thế.

Cảm ơn

+0

Hãy xem [ConsoleSetLibPath] (https://bitbucket.org/anthony_tuininga/cx_freeze/src/default/cx_Freeze/initscripts/ConsoleSetLibPath.py) initscript. Nó sẽ có thể tinh chỉnh đó để tìm các thư viện trong một thư mục con. –

+0

Bạn sử dụng bản initcript đó như thế nào? Có vẻ rất hứa hẹn nhưng tôi không thấy cách tích hợp nó. – ibell

+0

Nếu bạn đang sử dụng tập lệnh setup.py, hãy chỉ định tùy chọn 'init_script' cho' build_exe' ([docs] (http://cx-freeze.readthedocs.org/en/latest/distutils.html # build-exe)). Hoặc nếu bạn đang sử dụng lệnh 'cxfreeze', có [--init-script flag] (http://cx-freeze.readthedocs.org/en/latest/script.html#cmdoption--init-script) . –

Trả lời

3

Tôi hiểu sự thất vọng của bạn. Những gì tôi có xu hướng làm là lấy toàn bộ thư mục xây dựng và di chuyển nó vào thư mục tập tin chương trình giả sử bạn đang sử dụng một máy tính Windows. Sau đó, tạo một lối tắt trên màn hình nền cho tệp thực thi. Sau đó tôi thường thay đổi biểu tượng để làm hài lòng mắt. Nói cách khác, tất cả các tệp hệ thống đều bị ẩn và tất cả những gì bạn còn lại chỉ là một biểu tượng đẹp trên desktop.

3

"thủ công" đã làm điều đó, nhưng đây có phải là cách chính xác không? tôi đang trên win7 x64 cx_freeze 4.3.2

init_script của tôi, kết hợp từ Console.pyConsoleSetLibPath.py

import encodings 
import os 
import sys 
import warnings 
import zipimport 

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep) 
if DIR_NAME not in paths: 
    paths.insert(0, DIR_NAME) 
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths) 
    os.execv(sys.executable, sys.argv) 

sys.frozen = True 
sys.path = sys.path[:4] 

# i added this line 
sys.path.append(r'lib') 

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") 
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") 

m = __import__("__main__") 
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) 

# The following if/else is copied from ConsoleSetLibPath.py 
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME: 
    moduleName = m.__name__ 
else: 
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME))) 
    moduleName = "%s__main__" % name 

code = importer.get_code(moduleName) 
exec code in m.__dict__ 

versionInfo = sys.version_info[:3] 
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4): 
    module = sys.modules.get("threading") 
    if module is not None: 
     module._shutdown() 

Sau đó, tôi lưu tập tin này trong C:\Python27\Lib\site-packages\cx_Freeze\initscripts như ConsoleSetLibPathx.py và trong setup.py tôi

setup(
    name = 'xxx', 
    version = '0.1', 
    options = {'build_exe': {'includes':includes, 
          'excludes':excludes, 
          'packages':packages, 
          'include_files':includefiles, 
          'create_shared_zip':True, 
          'include_in_shared_zip':True, 
           # use the "hacked" init_script ? 
          'init_script':'ConsoleSetLibPathx', 
          'include_msvcr':True, 
          } 

          }, 
    executables = [exe] 
) 

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works. 

tôi cảm thấy tôi nên làm điều đó trong các tùy chọn, hoặc một nơi nào đó, nhưng không hoàn toàn hiểu doc ​​cx_freeze ngay bây giờ. có thể --target-dir hoặc --default-path hoặc --replace-paths? không chắc chắn làm thế nào để sử dụng chúng

chỉnh sửa: xin lỗi điều này cần cải thiện, khi tôi kiểm tra điều này trong một win7 sạch trong vmware, nó hoạt động nhưng nó hành động kỳ lạ, mã của tôi không đọc khóa bấm phím không hoạt động. không chắc phần nào sai.

+0

Không, tôi không nghĩ rằng có một tùy chọn để làm điều này mà không cần chỉnh sửa bản initscript hiện tại. –

+0

Nhân tiện, trong phần ở đầu sửa đổi 'LD_LIBRARY_PATH', tôi nghĩ bạn có thể cần thay đổi dòng' paths.insert (0, DIR_NAME) 'thành' paths.insert (0, os.path.join (DIR_NAME) , 'lib')) '. Tuy nhiên, điều đó chỉ ảnh hưởng đến các hệ thống Unix. Đối với Windows, tôi nghĩ bạn có thể cần phải thêm cùng một thư mục vào biến môi trường 'PATH'. –

+0

'DIR_NAME' đến từ đâu? Tôi nhận được một lỗi trên dòng 'os.environ [" LD_LIBRARY_PATH "] = os.pathsep.join (đường dẫn)' bởi vì giá trị quá dài. Điều này có vẻ lạ, bởi vì trên Windows này nên là 'lib', ba ký tự. – ToothlessRebel

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