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.py
和 configB.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
运行 通过 -m
从 Documents
修改 sys.path
的另一种方法是 运行 通过 Documents
目录中的 -m
开关修改 main.py
。当 运行ning python main.py
时,脚本的目录将放在路径上。当 运行ning python -m Common.Scripts.main
时,当前工作目录将放在路径上,因此 ProjectA
和 ProjectB
可自动发现:
$ pwd
/path/to/Documents
$ python -m Common.Scripts.main
我有多个项目都需要一个通用脚本 (main.py
),但我需要它们具有针对每个项目的不同可用功能。这意味着当我 运行 在项目 A 中使用的脚本时,我希望能够导入它的 configA.py
,但是当 运行 将它用于项目时导入 configB.py
B.
例如,假设在 configA.py
和 configB.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
运行 通过 -m
从 Documents
修改 sys.path
的另一种方法是 运行 通过 Documents
目录中的 -m
开关修改 main.py
。当 运行ning python main.py
时,脚本的目录将放在路径上。当 运行ning python -m Common.Scripts.main
时,当前工作目录将放在路径上,因此 ProjectA
和 ProjectB
可自动发现:
$ pwd
/path/to/Documents
$ python -m Common.Scripts.main