================================ 10.9 å°†æ–‡ä»¶å¤¹åŠ å…¥åˆ°sys.path ================================ ---------- 问题 ---------- ä½ æ— æ³•å¯¼å…¥ä½ çš„Python代ç å› ä¸ºå®ƒæ‰€åœ¨çš„ç›®å½•ä¸åœ¨sys.pathé‡Œã€‚ä½ æƒ³å°†æ·»åŠ æ–°ç›®å½•åˆ°Pythonè·¯å¾„ï¼Œä½†æ˜¯ä¸æƒ³ç¡¬é“¾æŽ¥åˆ°ä½ 的代ç 。 ---------- 解决方案 ---------- 有两ç§å¸¸ç”¨çš„æ–¹å¼å°†æ–°ç›®å½•æ·»åŠ åˆ°sys.path。第一ç§ï¼Œä½ å¯ä»¥ä½¿ç”¨PYTHONPATH环境å˜é‡æ¥æ·»åŠ ã€‚ä¾‹å¦‚ï¼š .. code-block:: python 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文件,将目录列举出æ¥ï¼Œåƒè¿™æ ·ï¼š .. code-block:: python # 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的值。例如: .. code-block:: python import sys sys.path.insert(0, '/some/dir') sys.path.insert(0, '/other/dir') 虽然这能“工作â€ï¼Œä½†æ˜¯åœ¨å®žè·µä¸æžä¸ºè„†å¼±ï¼Œåº”å°½é‡é¿å…ä½¿ç”¨ã€‚è¿™ç§æ–¹æ³•的问题是,它将目录å硬编ç åˆ°äº†ä½ çš„æºä»£ç ã€‚å¦‚æžœä½ çš„ä»£ç 被移到一个新的ä½ç½®ï¼Œè¿™ä¼šå¯¼è‡´ç»´æŠ¤é—®é¢˜ã€‚æ›´å¥½çš„åšæ³•是在ä¸ä¿®æ”¹æºä»£ç 的情况下,将pathé…置到其他地方。如果您使用模å—级的å˜é‡æ¥ç²¾å¿ƒæž„é€ ä¸€ä¸ªé€‚å½“çš„ç»å¯¹è·¯å¾„ï¼Œæœ‰æ—¶ä½ å¯ä»¥è§£å†³ç¡¬ç¼–ç 目录的问题,比如__file__。举个例å: .. code-block:: python 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文件里。