根据参数导入Python模块

时间:2018-12-04 07:35:36

标签: python argparse

我正在尝试从子文件夹动态导入基于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

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分:2)

我没发现任何问题

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 :(得分:0)

该问题已通过使用解决:

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

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

从那里开始使用葡萄帮助就是这样:

sqlfile = __import__('sqlfile')

然后从那里我可以使用变量执行相关的sql查询。