我正在尝试从子文件夹动态导入基于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
答案 0 :(得分:2)
您可以使用__import__(filename: str)
函数代替import
语句。它的作用相同:
# option 1
import foo as bar
# option 2
bar = __import__('foo')
如果需要从一边导入,则需要将目录添加到module search paths
。有多种方法可以实现此目标,具体取决于您的Python版本。您可以在精彩的帖子中找到它们:
答案 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查询。