Đang cố gắng để hiểu làm thế nào chúng ta có thể kết hợp hai khía cạnh togather
- tải tài nguyên trong hệ thống tập tin bản địa
- đóng gói trong file nén
Đọc qua hướng dẫn nhanh chóng trên zipimport: http://www.doughellmann.com/PyMOTW/zipimport/
Tôi thấy ví dụ sau:
import sys
sys.path.insert(0, 'zipimport_example.zip')
import os
import zipimport
importer = zipimport.zipimporter('zipimport_example.zip')
module = importer.load_module('example_package')
print module.__file__
print module.__loader__.get_data('example_package/README.txt')
Tôi nghĩ rằng đầu ra của __FILE__ là "zipimport_example.zip/example_package/__init__.pyc"
Cần phải kiểm tra cách nhìn từ bên trong.
Nhưng sau đó chúng tôi luôn có thể làm một cái gì đó như thế này:
if ".zip" in example_package.__file__:
...
load using get_data
else:
load by building the correct file path
[Edit:] Tôi đã cố gắng để làm việc ra ví dụ một chút tốt hơn.
Nếu gói được nhập dưới dạng file nén sau đó, có hai điều xảy ra
- __FILE__ chứa ".zip" trong đó là con đường.
- __loader__ có sẵn trong không gian tên
Nếu hai điều kiện này được đáp ứng thì trong thời hạn gói bạn có thể làm:
print __loader__.get_data(os.path.join('package_name','README.txt'))
khác các module đã được nạp bình thường và bạn có thể làm theo các cách tiếp cận thường xuyên để tải tệp.
OK đây là một câu trả lời pythonic. get_data trông thú vị, nhưng pkg_resources là cách để đe dọa, nhưng tôi chắc chắn sẽ xem xét nó khi tôi bắt đầu sử dụng các distutils để gói dự án của tôi. –
Tôi đang tìm giải pháp tương tự. 'get_data' là tuyệt vời nhưng tôi cần lấy đối tượng giống như tệp cho tệp này, chứ không phải nội dung của tệp trực tiếp. Có cách nào tao nhã không? – zegkljan
@zegkljan Cách pythonic nhất là quấn nó với BytesIO (StringIO trong Py2): 'file_like = BytesIO (get_data (__ package__, 'filename.dat'))' – cincodenada