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

2024-06-16 09:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有Python代码的repo,其结构可以归结为:

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目录以及repo根目录中,那么我将能够使用根目录中的绝对路径,即在tool1.py中我可以编写

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错误

我知道有一种解决方法可以使用PYTHONPATHenv变量来实现,方法是使用repo_root的绝对路径对其进行扩充,并将其提供给工具脚本的调用,即:

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

但我更喜欢不那么笨重的

你知道我该怎么做吗


Tags: 模块工具topath方法pylibrepo
1条回答
网友
1楼 · 发布于 2024-06-16 09:20:53

使用sys.path.append('/custom/path/to/modules')lib的路径添加到作用域中。然后它应该可以作为一个模块调用

您确实需要在任何要导入的目录中添加__init__.py文件,就像它是一个模块一样,否则Python不会将它们视为模块,您将得到另一个ImportError

相关问题 更多 >