从父目录导入包

问题描述 投票:0回答:1

我使用Python 3.10

这是我的树目录:

.
├── packages
│   ├── __init__.py
│   └── my_func.py
└── run
    └── run.py

我想将函数从 my_func.py 导入到 run.py,然后从 run 目录运行 run.py。

运行.py:

# import os
# import sys


# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from my_func import func1

func1()

my_func.py:

def func1():
    print("OK")

我已经尝试过下面的代码并且它有效。

import os
import sys


sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from my_func import func1

但我想用 sys.path.append 导入 func1 而无需“技巧”。有可能吗?

python import directory package
1个回答
0
投票

好吧,你想从 Python 的父目录导入一个函数。明白了!

从您所显示的情况来看,您当前正在使用

sys.path.append
方法,我同意,这种方法感觉有点像“黑客”。

更简洁的方法是使用 Python 的包和模块系统。这是一个简短的指南:

  1. 使

    packages
    成为正确的包: 确保
    __init__.py
    目录中有一个
    packages
    文件(您的树中存在
    init.py
    的拼写错误)。这使得 Python 能够将其识别为一个包。它可以是一个空文件。

  2. 相对导入:

    run.py
    中,您可以使用相对导入来访问该函数。你会做类似的事情:

from ..packages.my_func import func1
  1. 作为模块执行:这种方法确实需要您将脚本作为模块运行。所以,不要这样做:
python run.py

您将导航到

run
packages
的父目录,然后执行:

python -m run.run

这样,相对导入路径就可以正确识别。

因此,本质上,权衡是从“黑客”转向以稍微不同的方式运行脚本。两种方法各有千秋,但使用 Python 的内置包和模块系统更为惯用。

    

© www.soinside.com 2019 - 2024. All rights reserved.