我使用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 的父目录导入一个函数。明白了!
从您所显示的情况来看,您当前正在使用
sys.path.append
方法,我同意,这种方法感觉有点像“黑客”。
更简洁的方法是使用 Python 的包和模块系统。这是一个简短的指南:
使
packages
成为正确的包: 确保 __init__.py
目录中有一个 packages
文件(您的树中存在 init.py
的拼写错误)。这使得 Python 能够将其识别为一个包。它可以是一个空文件。
相对导入: 在
run.py
中,您可以使用相对导入来访问该函数。你会做类似的事情:
from ..packages.my_func import func1
python run.py
您将导航到
run
和 packages
的父目录,然后执行:
python -m run.run
这样,相对导入路径就可以正确识别。
因此,本质上,权衡是从“黑客”转向以稍微不同的方式运行脚本。两种方法各有千秋,但使用 Python 的内置包和模块系统更为惯用。