python - Python:当位于不同目录时,如何选择多个脚本之一作为包导入到主脚本中?
问题描述
我有多个项目都需要一个通用脚本 ( main.py
),但我需要它们具有特定于每个项目的不同可用功能。这意味着当我运行用于项目 A 的脚本时,我希望能够导入它configA.py
,但在configB.py
为项目 B 运行它时导入它。
例如,假设在configA.py
和configB.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]}')
或者您也可以使用 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
-m
Documents
python main.py
python -m Common.Scripts.main
ProjectA
ProjectB
$ pwd
/path/to/Documents
$ python -m Common.Scripts.main
推荐阅读
- javascript - useFakeTimers 和异步回调
- azure - Azure 数据工厂 Web Activity 中 POST 请求的正文格式
- jquery - 如何通过选择框向数据表添加一行?
- css - 试图让背景图像在所有显示器和设备尺寸上保持“静态”
- python - 有没有一种快速的方法可以在 python 上保存图像文件?
- javascript - Google Apps 脚本 - 如何在函数的循环中引用对象
- excel - 在具有订阅的列中查找下一个非零值
- phpunit - 如何为静态方法编写 PHP 单元测试
- yarnpkg - Yarn (Binary) 在 Centos 7 上离线安装
- python - 解析文本文件并仅捕获具有特定字符的两行之间的行