首页 > 解决方案 > Python:当位于不同目录时,如何选择多个脚本之一作为包导入到主脚本中?

问题描述

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

例如,假设在configA.pyconfigB.py中,同一个函数有不同的定义foo()。我的目标是能够按照python3 main.py ../../ProjectA/Config/configA.py项目 A 的行运行某些东西,并且对 B 类似。然后在内部main.py,脚本将导入传递给它的文件(类似于config = import_module(sys.argv[0])),然后能够运行config.foo(),其行为会有所不同取决于通过哪个文件。

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

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

有没有办法让我能够导入我选择的包以在main.py给定的文件结构中使用?

标签: pythonpython-3.xmodulepackagepython-import

解决方案


您可以对不同的导入使用 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]}')

或者您也可以使用 useimportlib.import_module代替if/else链:

import importlib

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

然后通过

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

通过-m从运行Documents

修改的替代方法是通过目录中的开关sys.path运行。运行时,脚本的目录将放在路径上。运行时,当前工作目录将被放在路径上,因此可以自动发现:main.py-mDocumentspython main.pypython -m Common.Scripts.mainProjectAProjectB

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

推荐阅读