【问题标题】:Import Python module based on argument根据参数导入 Python 模块
【发布时间】:2019-05-05 13:54:49
【问题描述】:

我正在尝试从子文件夹中动态导入基于 python 的 SQL 查询模块,并且该文件夹是通过使用 argparse 模块获得的。

我的项目结构:

main_file.py
Data_Projects/
   ITA_data/
      __init__.py
      sqlfile.py
   UK_data/
      __init__.py
      sqlfile.py

在 main_file.py 中是 argparse 模块,其参数 'dir' 包含指定目录的位置,即

parser.add_argument('--dir', default='Data_Projects/ITA_data/', type=str,
                        help="set the data directory")

到目前为止,我的理解是模块应该在顶部导入,并且只导入一个我会使用的 sql 查询: from Data_Project.ITA_data import sqlfile

我知道在 args 定义后我无法设置 import 语句,那么我如何才能在顶部的导入中保持格式正确,然后用之后定义的参数进行追溯更新呢?

非常感谢。

更新

感谢以下答案。我现在尝试分配:

sqlfile = __import__(in_arg.dir + 'sqlfile.py')

但是我收到以下错误:

*** ModuleNotFoundError: 没有名为“Data_Projects/ITA_data/sqlfile”的模块

我尝试过使用类似的东西

os.path.join(Path(__file__).resolve().parents[0], in_arg.dir + 'sqlfile')

如果有帮助,当我尝试时:

__import__('Data_Projects') - works fine
__import__('Data_Projects/ITA_data') - doesn't work - ModuleNotFound

作为验证我没有疯的检查:

os.path.exists('Data_Projects/ITA_Data/sqlfile.py') >>> True
os.path.exists(in_arg.dir + 'sqlfile.py') >>> True

【问题讨论】:

  • 没有限制必须在顶部进行导入,您可以在使用的范围(之前)导入模块。

标签: python argparse


【解决方案1】:

我看不出有什么问题

import argparse
parser = ...
parser.add_argument('data', choices=['UK', 'ITA'])
args = parser.parse_args()
if args.dir == 'UK':
    import UK_data as data
elif args.dir == 'ITA':
    import ITA_data as data
else ...

您可以使用函数和__name__ 等对其进行优化。但是条件导入是可以的,只要它发生在使用data 模块之前。

【讨论】:

    【解决方案2】:

    您可以使用__import__(filename: str) 函数代替import 语句。也是一样的:

    # option 1
    import foo as bar
    # option 2
    bar = __import__('foo')
    

    如果你需要从旁边导入,你需要将你的目录添加到module search paths。有几种方法可以实现这一点,具体取决于您的 Python 版本。您可以在很棒的帖子中找到它们:

    How to import a module given the full path?

    【讨论】:

    • 谢谢 - 我可以在定义 args 之后添加 bar,有效地在我的模块中间添加 import 语句吗?
    • 你可以把这个语句放在任何你想要的地方
    • 我已经更新了我的答案,你能再帮忙吗?谢谢:)
    【解决方案3】:

    问题已通过使用解决:

    import sys
    sys.path.insert(0, os.getcwd() + "/" + in_arg.dir)
    

    这会将 PYTHONPATH 变量设置为包含我想要用于搜索文件的目录(根据参数而变化)。

    从那里使用葡萄帮助这是一个例子:

    sqlfile = __import__('sqlfile')
    

    然后我可以使用该变量来执行相关的 sql 查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2019-03-22
      • 2016-12-15
      相关资源
      最近更新 更多