2009-12-21 46 views
10

Tôi đã tìm thấy giải pháp để thêm tệp trong library.zip qua: Extend py2exe to copy files to the zipfile where pkg_resources can load them.Py2exe: Nhúng các tệp tĩnh trong tệp exe và truy cập chúng

Tôi có thể truy cập vào tệp của mình khi library.zip không bao gồm tệp exe.

Tôi thêm tệp: text.txt vào thư mục: foo/media trong library.zip. Và tôi sử dụng mã này:

import pkg_resources 
import zipfile 
from cStringIO import StringIO 

my_data = pkg_resources.resource_string(__name__,"library.zip") 

filezip = StringIO(my_data) 
zip = zipfile.ZipFile(filezip) 
data = zip.read("foo/media/text.txt") 

tôi cố gắng sử dụng pkg_resources nhưng tôi nghĩ rằng tôi không hiểu điều gì đó bởi vì tôi có thể mở trực tiếp "library.zip".

Câu hỏi của tôi là làm cách nào tôi có thể thực hiện việc này khi thư viện.zip được nhúng vào exe?

Trân trọng

Jean-Michel

Trả lời

0

Bạn không nên sử dụng pkg_resources để lấy file library.zip. Bạn nên sử dụng nó để lấy tài nguyên được thêm vào.

Giả sử bạn có cấu trúc dự án sau:

setup.py 
foo/ 
    __init__.py 
    bar.py 
    media/ 
     image.jpg 

Bạn sẽ sử dụng resource_string (hay, tốt, resource_stream) để truy cập image.jpg:

img = pkg_resources.resource_string(__name__, 'media/image.jpg') 

Điều đó sẽ "chỉ làm việc". Ít nhất nó đã làm khi tôi đóng gói các tập tin media của tôi trong EXE. (Xin lỗi, tôi đã rời khỏi công ty mà tôi đang sử dụng py2exe, do đó, không có một ví dụ làm việc để vẽ.)

Bạn cũng có thể thử sử dụng pkg_resources.resource_filename(), nhưng tôi không nghĩ hoạt động dưới py2exe.

1

Cảm ơn bạn nhưng tôi tìm thấy giải pháp

my_data = pkg_resources.resource_stream("__main__",sys.executable) # get lib.zip file 
zip = zipfile.ZipFile(my_data) 
data = zip.read("foo/media/doc.pdf") # get my data on lib.zip 
file = open(output_name, 'wb') 
file.write(data) # write it on a file 
file.close() 

Trân trọng

10

tôi gom góp một giải pháp hợp lý gọn gàng với điều này, nhưng nó không sử dụng pkg_resources.

Tôi cần phân phối các công cụ hiệu suất như EXE độc lập, nghĩa là, tất cả được gói vào một tệp .exe. Tôi cũng cần gửi thông báo khi các công cụ này được sử dụng, mà tôi thực hiện thông qua API ghi nhật ký, sử dụng cấu hình dựa trên tệp. Tôi đã xóa tệp logging.cfg fileto khiến việc chuyển đổi các thông báo này trở nên khó khăn hơn, tức là bằng cách xóa tệp lỏng lẻo ... điều này có thể sẽ làm hỏng ứng dụng.

Vì vậy, sau đây là các bit thú vị từ setup.py của tôi:

LOGGING_CFG = open('main/resources/logging.cfg').read() 

setup(
    name='productivity-tool', 
    ... 

    # py2exe extras 
    console=[{'script': productivity_tool.__file__.replace('.pyc', '.py'), 
       'other_resources': [(u'LOGGINGCFG', 1, LOGGING_CFG)]}], 
    zipfile=None, 
    options={'py2exe': {'bundle_files': 1, 'dll_excludes': ['w9xpopen.exe']}}, 
) 

Sau đó, trong các mã khởi động cho productivity_tool.py:

from win32api import LoadResource 
from StringIO import StringIO 
from logging.config import fileConfig 
... 

if __name__ == '__main__': 
    if is_exe(): 
     logging_cfg = StringIO(LoadResource(0, u'LOGGINGCFG', 1)) 
    else: 
     logging_cfg = 'main/resources/logging.cfg' 
    fileConfig(logging_cfg) 
    ... 

Làm việc một điều trị !!!

+0

Giải pháp gọn gàng! Tôi đã sử dụng nó và nó hoạt động tuyệt vời! – foresightyj

+0

Điều này có hoạt động trên các tệp png không? Tôi sắp thử nó, nhưng nếu bạn biết tôi sẽ rất biết ơn khi nghe. –

+0

Được rồi, có một số vấn đề về định dạng tệp như tôi nghĩ tôi sẽ xem xét những vấn đề đó nhưng khác với nó nên hoạt động đúng không? –

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