10.8 读å�–ä½�于包ä¸çš„æ•°æ�®æ–‡ä»¶Â¶
问题¶
ä½ çš„åŒ…ä¸åŒ…å�«ä»£ç �需è¦�去读å�–的数æ�®æ–‡ä»¶ã€‚ä½ éœ€è¦�å°½å�¯èƒ½åœ°ç”¨æœ€ä¾¿æ�·çš„æ–¹å¼�æ�¥å�šè¿™ä»¶äº‹ã€‚
解决方案¶
å�‡è®¾ä½ 的包ä¸çš„æ–‡ä»¶ç»„织æˆ�如下:
mypackage/
__init__.py
somedata.dat
spam.py
现在å�‡è®¾spam.py文件需è¦�读å�–somedata.dat文件ä¸çš„å†…å®¹ã€‚ä½ å�¯ä»¥ç”¨ä»¥ä¸‹ä»£ç �æ�¥å®Œæˆ�:
# spam.py
import pkgutil
data = pkgutil.get_data(__package__, 'somedata.dat')
ç”±æ¤äº§ç”Ÿçš„å�˜é‡�是包å�«è¯¥æ–‡ä»¶çš„原始内容的å—节å—符串。
讨论¶
è¦�读å�–æ•°æ�®æ–‡ä»¶ï¼Œä½ å�¯èƒ½ä¼šå€¾å�‘于编写使用内置的I/ O功能的代ç �,如open()。但是这ç§�方法也有一些问题。
首先,一个包对解释器的当å‰�å·¥ä½œç›®å½•å‡ ä¹Žæ²¡æœ‰æŽ§åˆ¶æ�ƒã€‚å› æ¤ï¼Œç¼–程时任何I/Oæ“�作都必须使用ç»�对文件å��。由于æ¯�个模å�—包å�«æœ‰å®Œæ•´è·¯å¾„çš„__file__å�˜é‡�,这弄清楚它的路径ä¸�是ä¸�å�¯èƒ½ï¼Œä½†å®ƒå¾ˆå‡Œä¹±ã€‚
第二,包通常安装作为.zip或.egg文件,这些文件并ä¸�åƒ�åœ¨æ–‡ä»¶ç³»ç»Ÿä¸Šçš„ä¸€ä¸ªæ™®é€šç›®å½•é‡Œé‚£æ ·è¢«ä¿�å˜ã€‚å› æ¤ï¼Œä½ 试图用open()对一个包å�«æ•°æ�®æ–‡ä»¶çš„归档文件进行æ“�ä½œï¼Œå®ƒæ ¹æœ¬ä¸�会工作。
pkgutil.get_data()函数是一个读å�–æ•°æ�®æ–‡ä»¶çš„高级工具,ä¸�用管包是如何安装以å�Šå®‰è£…在哪。它å�ªæ˜¯å·¥ä½œå¹¶å°†æ–‡ä»¶å†…容以å—节å—符串返回给ä½
get_data()的第一个å�‚数是包å�«åŒ…å��çš„å—ç¬¦ä¸²ã€‚ä½ å�¯ä»¥ç›´æŽ¥ä½¿ç”¨åŒ…å��,也å�¯ä»¥ä½¿ç”¨ç‰¹æ®Šçš„å�˜é‡�,比如__package__。第二个å�‚数是包内文件的相对å��称。如果有必è¦�,å�¯ä»¥ä½¿ç”¨æ ‡å‡†çš„Unix命å��规范到ä¸�å�Œçš„目录,å�ªè¦�最å�Žçš„目录ä»�ç„¶ä½�于包ä¸ã€‚