python---引用其他py文件中的函数-yuan
/user/test:
....A
........a.py
....B
........b.py
文件a.py的内容:
def fa():
print("a")
b.py想调用a.py中的函数fa():
sys添加路径方法
import sys
sys.path.append("test/A")
from a import *
fa()
init方法-1:
-
在A文件夹和B文件夹中新建__init__.py文件,目录变成:
test:
....init.py
....A
........a.py
........init.py
....B
........b.py
........init.py -
b.py中的内容为:
from A.a import *
fa()
此时,b.py运行的时候,首先需要将目录切换到test文件夹,即:/user/test目录下;然后执行python -m B.b
。这个时候会把当前执行目录(/user/test
)添加到sys.path中。这个目录包含需要导入的模块A.a的路径,所以模块导入成功。
如果直接在/user/test/B
目录下运行python b.py
,则会将b.py文件所在的目录/user/test/B
添加到sys.path中。这个目录不包含导入的模块:a.py的路径(/user/test/A
),所以会导入模块失败。
init方法-2:
- 在test文件夹中新建文件c.py,在c.py中调用b.py,此时,b.py导入a.py模块的时候以c.py作为相对路径。
- b.py
from A.a import *
def fb():
fa()
- c.py
from B.b import *
fb()
- 执行
python c.py
,此时,会把c.py的目录/user/test
添加到sys.path中。模块可以导入成功。
总结:
python导入模块的机制原理:将from后面的内容(即要导入的模块),拼接到sys.path中的每一条路径后面,如果可以正确识别,则该模块可以正确导入。否则导入失败。根据该原理:__init.py__文件的存在保证了只需将项目的根目录添加到sys.path中,其下的子文件夹和.py文件均可被识别。添加路径的方法可以使用sys.path.append()方法(python也会把当前执行的py文件所在目录自动添加到sys.path中)。
相对路径..
的使用:
Python相对导入:ValueError: attempted relative import beyond top-level package
目录:
test:
....init.py
....test1.py
....test2.py
....A
........a.py
........init.py
....B
........b.py
........init.py
....C
........init.py
........A
............a.py
............init.py
........B
............b.py
............init.py
文件a.py的内容:
def funa():
print("a")
文件test/B/b.py的内容:
from ..A.a import *
def funb():
print("b")
funa()
文件test/C/B/b.py的内容:
from ..A.a import *
def funb():
print("b")
funa()
文件test1.py的内容:
from B.b import *
funb()
文件test2.py的内容
from test.B.b import *
funb()
总结
如果运行的文件在包中,则运行文件的同级目录不能作为相对路径使用。父级目录不能作为相对路径使用。
对于上面的示例,运行test.py文件,则test.B.b模块中不能使用相对路径导入test.A.a模块(from ..A.a import *
)。这是因为..A已经退到了运行文件的同级目录。而test.C.B.b可以使用相对路径导入test.C.A.a模块。因为..A表示目录:test.C
,当前目录是test
。
运行test/B/b文件,则无法导入test.A.a模块,因为..A表示test/目录,是当前运行文件目录(test/B)的父目录。