根据QuantConnect的目录结构,我正在尝试修复我的“库”导入。他们组织“用户库”的方式是这样的:
假设我创建了一个名为" project“的项目,该项目通过UI选择选择了一个名为"Utilities”的库。QC创建以下文件夹结构:
.
├── Project
|── main.py
├── Library
├── Utilities
├── Whatever.py然而,QC导入"Utilities“库的方式出现了一个问题。它通过导入目录的所有内容,同时删除顶级目录名来实现此目的。您可以将生成的结构看作这样:
.
├── Project
|── main.py
├── Whatever.py因此,我不能再使用from Utilities.Whatever import *。因此,为了缓解他们平台上的问题,我将每个库中的所有内容放在一个同名的文件夹中。因此,原始结构现在看起来像:
.
├── Project
|── main.py
├── Library
├── Utilities
├── Utilities
├── Whatever.py...and最终的结构如下所示:
.
├── Project
|── main.py
├── Utilities
├── Whatever.py现在,导入按预期工作。只是现在它们只能通过QC的在线“算法实验室”按预期工作,而不是在本地工作!由于QC导入其用户库的方式,我无法更改此布局,因此我需要创建一个python导入钩子,该钩子将尝试查找一个环境变量,如果未设置该变量,则默认不实现该钩子;但是当找到该环境变量时,假定它在非QC环境中运行,并且应该在导入的第一级目录名称之前进行设置。即,将from Utilities.Whatever import *转换为from Utilities.Utilities.Whatever import *。
我读过许多关于python的导入钩子的文章/教程,但它们都提供了各种各样的解决方案来解决我正在寻找的问题,而且我无法理解钩子结构的内部工作原理。
发布于 2021-09-15 13:13:50
我最终创建了两个名为'Library.py‘的文件。一个是空的,放在Library/Utilities/Utilities中,另一个(非空)放在Library/Utilities中。因此,现在,当我在QC环境中运行的任何给定脚本中键入import Utilities.Library时,什么都没有发生(正如它应该发生的那样),因为被引用的Library.py文件是空的;当它在本地环境中运行时,将执行以下代码:
import os
import sys
# Use env variable to ensure we only update the sys path once
env_check = 'Checked-Library-Environment'
if os.environ.get(env_check) is None:
os.environ[env_check] = 'True'
_path = None
path = os.getcwd()
target = "Library"
library = None
# Stop searching when we've reached the root
while path is not _path:
test_path = os.path.join(path, target)
if os.path.isdir(test_path):
library = test_path
break
_path = path
path = os.path.dirname(path)
# If we've found the Library directory, add its contents to the module path list
if library is not None:
for name in os.listdir(library):
path = os.path.join(library, name)
if not path in sys.path:
sys.path.append(path)https://stackoverflow.com/questions/69139561
复制相似问题