不同包的调用

在python中,包package的物理层面对应文件夹,模块model的物理层面对应程序文件.

1 如果一个文件夹中有__init__.py文件,则python不会认为它是一个普通的文件夹,而是一个package,在__init__.py程序中用于存放它所在package的顶层目录(即到它的父目录),为了其它包调用它的时候,python解释器可以找到它.

当一个包中没有__init__.py文件的时候,也可以,只不过其它程序想要调用这个package中的程序时,需要在开头把该package所在的顶层目录加上.

2 当一个package内的程序互相调用的时候,直接import即可,无需导入写路径.

3 当程序运行开头的导入包时,会执行该包下的__init__.py程序,例如如果__init__.py程序中有print('kkk')时,会输出.

 first程序

# import sys
# # 将的上级文件夹绝对路径导入临时系统变量
# sys.path.append("/home/sxtj/han/推荐系统/program")

import os,sys
#这里是把顶层目录加入到python的环境变量中。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR)
sys.path.append(BASE_DIR)

from product import *
from package2 import quotient

a = product(2,4)
print(a)
b = quotient.quotient(10,5)
print(b)
# /home/sxtj/han/推荐系统/program
# 8
# 0.5
first.py

 product程序

def product(x, y):
    return x*y
product.py

 quotient程序

def quotient(x, y):
    return y/x
quotient.py

 用__init__.py程序时,可不用导入顶层目录来找模块.

如上用main.py调用test1.py和test2.py程序的时候,要提前在各自的__init__.py文件下声明,这样导入t1和t2包的时候,才能找到它们下面的模块和函数.

main程序

#!/usr/bin/env python 
# encoding: utf-8 

import pandas as pd
import warnings
import t1.t11.test1 as model1
import t2.test2 as model2
warnings.filterwarnings("ignore")

def func():
    pass
class Main():
    def __init__(self):
        pass
if __name__ == "__main__":
    model1.func()
    model2.func()
    df1=pd.read_csv('./cache/df1.csv')
    df2=pd.read_csv('./cache/df2.csv')
    df3=df1.copy()
    df3['value']=df1['value'].values*0.3+df2['value'].values*0.7
    df3.to_csv('./cache/df3.csv',index=False)
View Code

test1程序

#!/usr/bin/env python 
# encoding: utf-8
import pandas as pd
import numpy as np
import os
import warnings
warnings.filterwarnings("ignore")

a = os.listdir('./')
print(a)
# ['cache', 't2', 'all_program.py', 't1']
# 特别要注意这里的文件输出的是main.py程序所在目录下的文件,
# 因为在main.py中调用的时候,这行程序相当于在main.py中运行
def func():
    print(11)
    df=pd.DataFrame(np.random.randint(0,100,(10,2)),columns=['id','value'])
    df['filename']=1
    df.to_csv('./cache/df1.csv')
class Main():
    def __init__(self):
        pass
if __name__ == "__main__":
    print(1)
View Code

t1文件夹下的__init__.py

# 参数__all__用于声明本文件夹下的模块和函数,
# 其他程序导入该文件夹时才能找到里面的程序文件.
__all__ = ['test1']
View Code

test2程序

#!/usr/bin/env python 
# encoding: utf-8
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")

def func():
    print(22)
    df = pd.DataFrame(np.random.randint(0, 100, (10, 2)), columns=['id', 'value'])
    df['filename'] = 2
    df.to_csv('./cache/df2.csv')
class Main():
    def __init__(self):
        pass
if __name__ == "__main__":
    print(2)
View Code

 

def quotient(x, y):
    return y/

参考:https://www.cnblogs.com/keep-going2099/articles/8178387.html#_label1

          https://www.cnblogs.com/yinzhengjie/p/8587656.html

          https://blog.csdn.net/XuZZ94/article/details/79669313

posted on 2019-10-23 18:29  吃我一枪  阅读(294)  评论(0编辑  收藏  举报

导航