使用PythonPath时,Python不会从模块导入函数

5fjcxozz  于 2022-12-01  发布在  Python
关注(0)|答案(1)|浏览(150)

我有一个简单的项目试图说明Python路径是如何工作的。下面是我当前的项目结构。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")

(With每个__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内部的函数?

6l7fqoea

6l7fqoea1#

在该示例中,根本不需要追加到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可能对进一步的研究有用。

相关问题