Python: 当位于不同的目录时,如何选择多个脚本中的一个作为一个包导入到主脚本中?

Python: How to choose one of multiple scripts as a package to import into a main script, when located in different directories?

我有多个项目都需要一个通用脚本 (main.py),但我需要它们具有针对每个项目的不同可用功能。这意味着当我 运行 在项目 A 中使用的脚本时,我希望能够导入它的 configA.py,但是当 运行 将它用于项目时导入 configB.py B.

例如,假设在 configA.pyconfigB.py 中,同一个函数 foo() 有不同的定义。我的目标是能够 运行 类似于项目 A 的 python3 main.py ../../ProjectA/Config/configA.py 和 B 的类似内容。然后在 main.py 中,脚本将导入传递给它的文件(一些东西像 config = import_module(sys.argv[0])),然后能够 运行 config.foo(),这将根据传递的文件而有所不同。

通过阅读一些关于 SO 的帮助帖子,我看到很多人建议 importlib.import_module(),因为我可以将包名称作为参数传递给 main.py。但与我读过的这些其他帖子相比,稍微复杂一点的是我的文件结构。似乎 import_module() 只有在 main/package 文件位于同一目录中,或者主脚本位于包的父目录中时才真正起作用。但是,我的文件结构如下所示:

└─ Documents
   ├─ Common
   │  └─ Scripts
   │     └─ main.py
   ├─ ProjectA
   │  └─ Config
   │     └─ configA.py
   └─ ProjectB
      └─ Config
         └─ configB.py

在给定此文件结构的情况下,有没有办法让我能够导入我选择的包以用于 main.py

您可以对不同的导入使用 if 语句:

import os
import sys

sys.path.insert(0, os.abspath('../..'))  # this is important so the packages are on the path

if sys.argv[1] == 'A':
    from ProjectA.Config.configA import foo
elif sys.argv[1] == 'B':
    from ProjectB.Config.configB import foo
else:
    raise ImportError(f'No module corresponding to {sys.argv[1]}')

或者您也可以使用 importlib.import_module 而不是 if/else 链:

import importlib

module = importlib.import_module('Project{x}.Config.config{x}'.format(x=sys.argv[1]))
foo = module.foo

然后使用via

python main.py A  # use foo from configA
python main.py B  # use foo from ConfigB

运行 通过 -mDocuments

修改 sys.path 的另一种方法是 运行 通过 Documents 目录中的 -m 开关修改 main.py。当 运行ning python main.py 时,脚本的目录将放在路径上。当 运行ning python -m Common.Scripts.main 时,当前工作目录将放在路径上,因此 ProjectAProjectB 可自动发现:

$ pwd
/path/to/Documents
$ python -m Common.Scripts.main