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文件里。