【问题标题】:Python is not importing functions from module when using PythonPath使用 PythonPath 时,Python 不从模块导入函数
【发布时间】:2022-12-20 04:06:37
【问题描述】:

我有一个简单的项目试图说明 Python Path 的工作原理。 下图是我目前的项目结构。main.py 看起来像这样,

import pathlib
import sys

cwd = pathlib.Path(__file__).parent.resolve()
source_directory = cwd / 'depth_1' / 'depth_2' / 'depth_3'
sys.path.append(str(source_directory))

每个row_x_file.py 只包含一个函数,

def row_x_print():
    print("Inside row_x_file.py")

(用 x 代替正确的号码)。每个__init__.py 只是from . import *

现在,因为我已经将 depth_3 的路径添加到 sys.path,所以我可以成功键入 import row_1 而不会出现错误。但是我永远无法访问从 __init__ 导出的函数,即我无法在 import row_1 之后运行 row_1_print(),但是 import row_1 运行没有失败。 from row_1 import row_1_print好像也没成功。

如何在成功输入import row_1 后才能运行row_1_file.py 中的函数?

【问题讨论】:

  • 刚开始组织一个项目已经有一段时间了,但我记得你不需要在__init__.py 中添加import,文件实际上是在你加载模块时加载的(这里是row_1模块) 所以看起来有些多余。
  • 请用所有示例代码填写问题 - 这样我们就可以为您指明正确的方向。我觉得您可能还想使用没有模块前缀的代码。请让我知道我的回答怎么也没有回答您的问题。
  • 现在可以了,干杯。

标签: python-3.x python-import pythonpath


【解决方案1】:

在该示例中,您根本不需要附加到 python 路径。

对于使用此类文件重新创建的示例:

d1/d2/d3/row_1/
    __init__.py
    test.py
main.py

和代码: main.py

#!python3

from d1.d2.d3.row_1 import test

if __name__ == "__main__":
    print("text")
    test.foo();
    test.bar();

__init__.py

X="module"

test.py

from . import X

def foo():
    print("yay it works")

def bar():
    print(f"value X: {X}")

你会得到输出:

text
yay it works
value X: module

现在,有了工作示例,以演示路径的行为方式,将main.py 编辑为:

#!python3

import pathlib, sys

cwd = pathlib.Path(__file__).parent.resolve()
source_directory = cwd / 'd1' / 'd2' / 'd3'
sys.path.append(str(source_directory))

from row_1 import test

if __name__ == "__main__":
    print("text")
    test.foo();
    test.bar();

哪个示例仍然有效,但路径已更改,因此现在不需要用于库采购的 d1.d2.d3 前缀。请注意不要覆盖库的名称,因为可能很难查明看似好的代码为何不起作用的问题。

问题:What is __init__.py for? 和 python module` documentation 可能对进一步研究有用。

【讨论】:

  • 这个例子的初衷是为了演示如何使用 Python Path 来减少 from 链接到嵌套目录中。
  • @Joe 如果现在的解释完全回答了您的问题,请告诉我。
猜你喜欢
  • 2016-09-12
  • 2022-11-11
  • 2015-05-23
  • 2016-07-09
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
相关资源
最近更新 更多