繁体   English   中英

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 ,但在为项目 B 运行它时导入configB.py

例如,假设在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使用?

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

然后使用通过

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

通过-mDocuments运行

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM