区分Python中的一些概念
- 一个以.py结尾的文件就是一个python module
- 任意一个文件夹,只要其中包含python module,就可以叫做python package.(Python2的话,该文件夹内还需要包含一个__init__.py文件)
- 我们既可以import package,也可以import module,以及module下的函数、类等等
Python引用自定义python文件的情况
Python的包引用可以分为如下四种情况:
- utils和main位于同级目录下
.
--main.py
--utils.py
- utils位于main下同级目录下的子目录内
.
--main.py
--dir/
----utils.py
- utils位于main的父目录内
.
--utils.py
--dir/
----main.py
- utils和main处于不同的目录下
.
--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即可。