Python的跨目录引用

Python 实践

区分Python中的一些概念

Python引用自定义python文件的情况

Python的包引用可以分为如下四种情况:

.
--main.py
--utils.py
.
--main.py
--dir/
----utils.py
.
--utils.py
--dir/
----main.py
.
--dir1/
----utils.py
--dir2/
----main.py

情况1

utils和main位于同级目录下

.
--main.py
--utils.py
# utils.py
def say_hello(name):
    return "hello " + name
# main.py
import utils

if __name__ == '__main__':
    print(utils.say_hello("world"))

直接在根目录下执行下面命令即可

python3 main.py

输出如下

hello world

情况2

utils位于main下同级目录下的子目录内

.
--main.py
--dir/
----utils.py
# main.py
from dir import utils

if __name__ == '__main__':
    print(utils.say_hello("world"))
# dir/utils.py
def say_hello(name):
    return "hello " + name

在根目录下执行下面的命令:

python3 main.py

即可得到下面的输出

hello world

情况3

utils位于main的父目录内

.
--utils.py
--dir/
----main.py

追加pythonpath

这种情况有些特殊。一般默认情况下只有main函数所在的目录会被添加到pythonpath,但是这里的utils.py在main.py的父目录中,所以我们需要将这个父目录也添加到pythonpath中。代码如下。

# dir/main.py
import sys
from os import path
# 这里相当于把相对路径 .. 添加到pythonpath中
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
import utils

if __name__ == '__main__':
    print(utils.say_hello("world"))
def say_hello(name):
    return "hello " + name

之后在根目录下执行如下命令:

python3 dir/main.py

输出如下:

hello world

另一种解决办法(使用python -m命令)

执行如下命令(这里就不需要追加pythonpath)

python3 -m dir.main

也可以看到hello world的输出

情况4

utils和main处于不同的目录下

.
--dir1/
----utils.py
--dir2/
----main.py

这种情况的解决办法与情况3相同,参考情况3即可。