【问题标题】:Importing from cousin module in Python从 Python 中的表兄弟模块导入
【发布时间】:2021-12-29 19:25:03
【问题描述】:

我有以下结构:

  • LICENSE.md
  • README.md
  • requirements.txt
    • 路线
      • route_a.py
      • __ 初始化 __.py
    • 实用程序
      • __ 初始化 __.py
      • db.py

在 db.py 中,我有一些看起来像这样的东西:

import mysql.connector

def get_value():
    # Query database using mysql.connector
    return value

value = get_value()

def query_that_uses_value(value):
     # do stuff with value
     return value2

我希望能够在route_a.py 内部以及db.py 的其他函数内部使用value。最好的方法是什么?

【问题讨论】:

  • 您当前的方法应该可行。你有什么问题吗?
  • 我不确定要在其他模块中添加什么才能使其正常工作。此外,必须将 value = get_value() 放在模块中间看起来有点奇怪。
  • 也许,您可以在其他模块中使用get_value()。如果你想缓存函数的结果,你可以使用 lru_cahce 装饰器来代替将值存储在变量中
  • 如果我多次调用get_value(),那么我将不得不多次调用数据库,如果可能的话我想避免这种情况。我不确定该装饰器如何使值可以跨模块访问。
  • 是的,我写过关于lru_cache 的文章。它将函数的结果存储在缓存中。因此,即使多次调用它,您也只需点击一次 DB。

标签: python python-import


【解决方案1】:
import sys   
sys.path.insert(0, "path")

我就是这样做的。 路径是您要使用的文件夹我会选择主文件夹,这样您的导入起点就相同。

在你的情况下,导入看起来像这样

from util.dp.py import get_value 

如果你在程序开始时有这个,你希望函数导入到

sys.path.insert(0,"path_to_src/src")

但 src 的路径必须是从根文件夹开始的绝对路径

【讨论】:

    【解决方案2】:

    route_a.py 中,只需import 来自..util.db 的变量value(以及您需要的其他函数),这是一个将引用src/util/db.py 的相对导入。以下是文件src/routes/route_a.py 应包含的内容:

    from ..util.db import value, function1, function2
    

    【讨论】:

      【解决方案3】:

      处理导入的最佳方法是在您的项目根目录中的export PYTHONPATH=${PWD},那里有srcrequirements.txt 等。

      所以在你的终端中,运行export PYTHONPATH=${PWD},你所有的导入应该是一致的并且从src开始。

      例如: from src.util.db import value from src.routes.route_a import something

      请注意,每次打开新终端时都应该运行export PYTHONPATH=${PWD},因为这不是永久性的。当您的终端消失时,您的 PYTHONPATH 应该重置,这是一件好事,也是最佳做法。

      别忘了从src 运行所有内容。点赞:python src/util/db.py

      如果你遵循这个结构,我保证你永远不会遇到任何导入问题。

      【讨论】:

        猜你喜欢
        • 2020-06-13
        • 2017-09-25
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        相关资源
        最近更新 更多