如何从可以在任何地方调用的脚本中导入模块?

时间:2019-03-28 13:39:15

标签: python python-3.x python-import

我有一个使用Python代码的仓库,其结构可以归结为:

repo_root\
  tool1\
    tool1.py
    tool1_aux_stuff.py
  tool2\
    tool2.py
    tool2_aux_stuff.py
  lib\
    lib1\
      lib1.py
      lib1_aux_stuff.py
    lib2\
      lib2.py
      lib2_aux_stuff.py

以下规则适用于模块用法:

  1. 任何工具都可以使用任何库中的模块以及其自己的包中的模块,但不能使用其他工具中的模块。
  2. 任何库都可以使用任何其他库以及其自己的包中的模块。库从不访问工具模块。
  3. 必须有一种方法可以从任何工作目录中调用任何工具,包括repo_root外部的工具。

问题是:如何从工具模块导入lib模块?

我知道,如果我将__init__.py添加到每个工具和lib目录以及回购根目录,那么我将能够使用来自根目录的绝对路径,即在tool1.py中我可以写< / p>

import lib.lib1, lib.lib2.lib2_aux_stuff

但是,如果我从随机位置执行tool1.py,例如

machine_name: ~/random/place$ python /path/to/repo/tool1/tool1.py

我收到ModuleNotFoundError: No module named 'lib' found错误。

我知道一种解决方法,可以使用PYTHONPATH env变量来实现,方法是使用指向repo_root的绝对路径来扩展它,并将其提供给工具脚本的调用,即:

machine_name: ~/random/place$ PYTHONPATH=$PYTHONPATH:/path/to/repo python /path/to/repo/tool1/tool1.py

但是我真的希望不那么笨拙。

有什么想法可以更直接地做到吗?

1 个答案:

答案 0 :(得分:0)

使用libsys.path.append('/custom/path/to/modules')的路径添加到范围。然后,它应该可以作为模块调用。

您确实需要在要导入的任何目录中将__init__.py文件添加为一个模块,否则Python不会将它们视为模块,您将获得另一个ImportError < / p>