首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python导入钩子到预挂起路径

Python导入钩子到预挂起路径
EN

Stack Overflow用户
提问于 2021-09-11 02:25:38
回答 1查看 27关注 0票数 0

根据QuantConnect的目录结构,我正在尝试修复我的“库”导入。他们组织“用户库”的方式是这样的:

假设我创建了一个名为" project“的项目,该项目通过UI选择选择了一个名为"Utilities”的库。QC创建以下文件夹结构:

代码语言:javascript
复制
.
├── Project
    |── main.py
├── Library
    ├── Utilities
        ├── Whatever.py

然而,QC导入"Utilities“库的方式出现了一个问题。它通过导入目录的所有内容,同时删除顶级目录名来实现此目的。您可以将生成的结构看作这样:

代码语言:javascript
复制
.
├── Project
    |── main.py
    ├── Whatever.py

因此,我不能再使用from Utilities.Whatever import *。因此,为了缓解他们平台上的问题,我将每个库中的所有内容放在一个同名的文件夹中。因此,原始结构现在看起来像:

代码语言:javascript
复制
.
├── Project
    |── main.py
├── Library
    ├── Utilities
        ├── Utilities
            ├── Whatever.py

...and最终的结构如下所示:

代码语言:javascript
复制
.
├── Project
    |── main.py
    ├── Utilities
        ├── Whatever.py

现在,导入按预期工作。只是现在它们只能通过QC的在线“算法实验室”按预期工作,而不是在本地工作!由于QC导入其用户库的方式,我无法更改此布局,因此我需要创建一个python导入钩子,该钩子将尝试查找一个环境变量,如果未设置该变量,则默认不实现该钩子;但是当找到该环境变量时,假定它在非QC环境中运行,并且应该在导入的第一级目录名称之前进行设置。即,将from Utilities.Whatever import *转换为from Utilities.Utilities.Whatever import *

我读过许多关于python的导入钩子的文章/教程,但它们都提供了各种各样的解决方案来解决我正在寻找的问题,而且我无法理解钩子结构的内部工作原理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-15 13:13:50

我最终创建了两个名为'Library.py‘的文件。一个是空的,放在Library/Utilities/Utilities中,另一个(非空)放在Library/Utilities中。因此,现在,当我在QC环境中运行的任何给定脚本中键入import Utilities.Library时,什么都没有发生(正如它应该发生的那样),因为被引用的Library.py文件是空的;当它在本地环境中运行时,将执行以下代码:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69139561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档