10.9 å°†æ–‡ä»¶å¤¹åŠ å…¥åˆ°sys.path¶
问题¶
ä½ æ— æ³•å¯¼å…¥ä½ çš„Python代ç �å› ä¸ºå®ƒæ‰€åœ¨çš„ç›®å½•ä¸�在sys.pathé‡Œã€‚ä½ æƒ³å°†æ·»åŠ æ–°ç›®å½•åˆ°Python路径,但是ä¸�æƒ³ç¡¬é“¾æŽ¥åˆ°ä½ çš„ä»£ç �。
解决方案¶
有两ç§�常用的方å¼�å°†æ–°ç›®å½•æ·»åŠ åˆ°sys.path。第一ç§�ï¼Œä½ å�¯ä»¥ä½¿ç”¨PYTHONPATH环境å�˜é‡�æ�¥æ·»åŠ ã€‚ä¾‹å¦‚ï¼š
bash % env PYTHONPATH=/some/dir:/other/dir python3
Python 3.3.0 (default, Oct 4 2012, 10:17:33)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/some/dir', '/other/dir', ...]
>>>
在自定义应用程åº�ä¸ï¼Œè¿™æ ·çš„环境å�˜é‡�å�¯åœ¨ç¨‹åº�å�¯åŠ¨æ—¶è®¾ç½®æˆ–é€šè¿‡shell脚本。
第二ç§�方法是创建一个.pth文件,将目录列举出æ�¥ï¼Œåƒ�è¿™æ ·ï¼š
# myapplication.pth
/some/dir
/other/dir
这个.pth文件需è¦�放在æŸ�个Pythonçš„site-packages目录,通常ä½�于/usr/local/lib/python3.3/site-packages 或者 ~/.local/lib/python3.3/sitepackages。当解释器å�¯åŠ¨æ—¶ï¼Œ.pth文件里列举出æ�¥çš„å˜åœ¨äºŽæ–‡ä»¶ç³»ç»Ÿçš„ç›®å½•å°†è¢«æ·»åŠ åˆ°sys.path。安装一个.pth文件å�¯èƒ½éœ€è¦�管ç�†å‘˜æ�ƒé™�ï¼Œå¦‚æžœå®ƒè¢«æ·»åŠ åˆ°ç³»ç»Ÿçº§çš„Python解释器。
讨论¶
æ¯”èµ·è´¹åŠ›åœ°æ‰¾æ–‡ä»¶ï¼Œä½ å�¯èƒ½ä¼šå€¾å�‘于写一个代ç �手动调节sys.path的值。例如:
import sys
sys.path.insert(0, '/some/dir')
sys.path.insert(0, '/other/dir')
虽然这能“工作â€�ï¼Œä½†æ˜¯åœ¨å®žè·µä¸æž�为脆弱,应尽é‡�é�¿å…�使用。这ç§�方法的问题是,它将目录å��硬编ç �åˆ°äº†ä½ çš„æº�代ç �ã€‚å¦‚æžœä½ çš„ä»£ç �被移到一个新的ä½�置,这会导致维护问题。更好的å�šæ³•æ˜¯åœ¨ä¸�修改æº�代ç �的情况下,将pathé…�置到其他地方。如果您使用模å�—级的å�˜é‡�æ�¥ç²¾å¿ƒæž„é€ ä¸€ä¸ªé€‚å½“çš„ç»�å¯¹è·¯å¾„ï¼Œæœ‰æ—¶ä½ å�¯ä»¥è§£å†³ç¡¬ç¼–ç �目录的问题,比如__file__。举个例å�:
import sys
from os.path import abspath, join, dirname
sys.path.insert(0, join(abspath(dirname(__file__)), 'src'))
这将srcç›®å½•æ·»åŠ åˆ°path里,和执行æ�’å…¥æ¥éª¤çš„代ç �在å�Œä¸€ä¸ªç›®å½•里。
site-packages目录是第三方包和模å�—å®‰è£…çš„ç›®å½•ã€‚å¦‚æžœä½ æ‰‹åŠ¨å®‰è£…ä½ çš„ä»£ç �,它将被安装到site-packages目录。虽然用于é…�ç½®pathçš„.pth文件必须放置在site-packages里,但它é…�置的路径å�¯ä»¥æ˜¯ç³»ç»Ÿä¸Šä»»ä½•ä½ å¸Œæœ›çš„ç›®å½•ã€‚å› æ¤ï¼Œä½ å�¯ä»¥æŠŠä½ 的代ç �放在一系列ä¸�å�Œçš„目录,å�ªè¦�那些目录包å�«åœ¨.pth文件里。