Python导入约定:显式bin / lib导入

时间:2014-02-06 18:43:57

标签: python python-2.7 github python-import python-unittest

建议要求:Python Imports的最佳实践

我需要建议:主要项目如何进行Python导入以及标准/ Pythonic方式来设置它。

我有一个项目 Foobar ,这是另一个更大,使用更充分的项目 Dammit 的子项目。我的项目目录如下所示:

/opt/foobar
/opt/foobar/bin/startFile.py
/opt/foobar/bin/tests/test_startFile.py
/opt/foobar/foobarLib/someModule.py
/opt/foobar/foobarLib/tests/test_someModule.py

所以,对于Dammit项目,我加入PYTHONPATH:

export PYTHONPATH=$PYTHONPATH:/opt/foobar

这让我可以添加一个非常清晰,易于追踪的导入:

from foobarLib.someModule import SomeClass

全部3个: * Dammit - 在导入中使用foobarLib让每个人都知道它不在Dammit项目中,它在Foobar中。 *我的startFile.py是一个具有相同pythonpath导入的附属进程。 * test_someModule.py也有明确的导入。

问题:这仅适用于foobarLib,而不适用于bin。

我想在/opt/foobar/bin/tests/test_startFile.py中运行测试。但是,如何设置路径并进行导入?我应该像这样进行相对导入:

PROJ_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
sys.path.insert(0, PROJ_ROOT)

或者,我应该将bin目录重命名为foobarBin,以便我执行导入:

from foobarBin.startFile import StartFile

我很想做以下事情:

/opt/foobarProject/foobar
/opt/foobarProject/foobar/bin/startFile.py
/opt/foobarProject/foobar/bin/tests/test_startFile.py
/opt/foobarProject/foobar/foobarLib/someModule.py
/opt/foobarProject/foobar/foobarLib/tests/test_someModule.py

然后,我可以用以下内容完成所有导入:

import foobar.bin.startFile
import foobar.lib.someModule

基本上,对于大型Python项目(以及他们的ADJUNCTS),在我看来,我们的目标是:

  • 尽量减少添加到pythonpath的目录数量;
  • 明确表明进口的来源。也就是说,人们使用'import lib.thing',如果python路径中有多个名为'lib'的目录, 这是麻烦/不明显的地方,没有调用 python和搜索sys.modules等。
  • 最小化我们向sys.path添加路径的次数,因为那是运行时并且有些不明显。

我已经使用了很长时间的Python,并成为了各种方式的项目的一部分,其中一些更愚蠢,一些更少。我想我想知道这里是否有最好的做法,以及它的原因?我的常规是添加foobarProject层好吗,好,坏,还是只有一种方式?

0 个答案:

没有答案