怎么引用模块

环境:win7 + python3.5.2
文档结构:

-project
 -data
 -src
  -filterCorpus.py
  -translateMonolingual.py

问题描述:在translateMonolingual.py中引用filterCorpus.py中的函数fun1

from src import  filterCorpus
filterCorpus.fun1()

即使translateMonolingual.py和filterCorpus.py在同一文件夹下,若translateMonolingual.py中直接引用import filterCorpus会出错
。这是因为python3需要绝对路径引用,从project的根位置开始指明被引模块的位置。通用格式为:from directory import module 。如果module存在于directory1下的directory2,那么建议写成from directory1.directory2 import module

一般来说,需要引用python模块,可以用如下形式:

import xxx
import xxx as xx
from xxx import xx

比如我们引入numpy模块:

In [21]: import numpy

In [22]: numpy
Out[22]: <module 'numpy' from '/home/chia/anaconda2/lib/python2.7/site-packages/numpy/__init__.pyc'>

然后在输入numpy,实际上我们看到,module numpy的路径实际上是一个__init__.pyc的文件pyc文件是python编译器编译生成的字节码文件。通常py文件改动就会生成一个pyc,如果有pyc存在的话默认用pyc。

python module中的__init__.py文件实际上是执行import命令时访问的文件。换句话说,init的py文件是一个module的指示器。如果一个文件夹里面有这个py文件,那么它就可以被视为一个包,通过import引入,如果没有,则无法引入。

如果我们自己写一些函数,想要当做一个python 的模块通过import导入的话,有两种方式。

  • 一种是写成xxx.py文件,然后通过from xxx import xfun

比如:

# this is util.py
def sayHello():
print "Hello"

然后在同一个文件夹中另一个文件中,调用这个模块

# this is main.py
from util import sayHello

这样是可行的。

  • 如果写的函数比较多,而且又有不同类别的话,我们就需要把所有的文件和文件中的函数放在一个文件夹中了。那么,这个文件夹里面就要放一个空白的__init__.py

当然,我们说__init__.py只要有就可以,但是它本身是一个py文件,因此可以在里面写一些语句。

比如一个较为重要的变量是 __all__,它一般定义为module中的所有子文件。

比如一个文件夹叫做 utils,其中有a.py, b.py
那么,__all__就可以写成:

__all__ = ['a', 'b']

定义了这个all变量的好处是,我们在进行模糊引入的时候,即:

from utils import *

就可以将所有的子文件import进来,比如我们就可以引用utils.a了。

为什么需要_init_.py

_init_.py文件用于组织包(package)。这里首先需要明确包(package)的概念。什么是包(package)?简单来说,包是含有python模块的文件夹。一个python模块(module)为一个py文件,里面写有函数和类。包(package)是为了更好的管理模块(module),相当于多个模块的父节点。

当文件夹下有_init_.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。这些module都可以通过同一个package引入代码中。

_init_.py文件怎么写
可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在_init_.py中加上:

__all__ = ['file1','file2'] #package1下有file1.py,file2.py

引用时使用写法

from package1 import *

file1.func1()

Python中module文件夹里__init__.py的功能的更多相关文章

  1. python 两个文件夹里的文件名对比

    比如需要一个xml对应一个jpg时,有时候会不小心少了其中一个文件,这时可以用以下代码比较缺少的是哪个文件: # -*- coding: utf-8 -*- import os path1 = r'. ...

  2. python导入其他文件夹下的.py文件

    想在globalpararm中导入read_config中的类 import sys sys.path.append('..') from common.read_config import Read ...

  3. python中对文件、文件夹,目录的基本操作

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目 ...

  4. [转]python中对文件、文件夹的操作——os模块和shutil模块常用说明

    转至:http://l90z11.blog.163.com/blog/static/187389042201312153318389/ python中对文件.文件夹的操作需要涉及到os模块和shuti ...

  5. Java以流的方式将指定文件夹里的.txt文件全部复制到另一文件夹,并删除原文件夹中所有.txt文件

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  6. python中对文件、文件夹的操作

    python中对文件.文件夹的操作需要涉及到os模块和shutil模块. 创建文件: 1) os.mknod("test.txt")       创建空文件 2) open(&qu ...

  7. python 批量创建文件及文件夹(文件夹里再创文件)

    python 批量创建文件及文件夹(文件夹里再创文件)思路:文件建到哪>文件名字叫啥>创建文件夹>去新建的文件下>新建文件>给文件里边写东西>写个反馈给控制台> ...

  8. python遍历文件夹中所有文件夹和文件,os.walk

    python中可以用os.walk来遍历某个文件夹中所有文件夹和文件. 例1: import os filePath = 'C:/Users/admin/Desktop/img' for dirpat ...

  9. python 将指定文件夹中的指定文件放入指定文件夹中

    import os import shutil import re #获取指定文件中文件名 def get_filename(filetype): name =[] final_name_list = ...

随机推荐

  1. 使提示框居中显示&自定义提示框

    ToastActivity.java文件: 1 public class ToastActivity extends AppCompatActivity { 2 private Button mbtn ...

  2. Qt:QVariant

    0.说明 QVariant可以表现出Qt数据类型中最普遍的行为. 一个QVariant对象中一次只保留一个type()的单个值(有的type()可以是多值的,例如StringList),可以用conv ...

  3. 革命性创新,动画杀手锏 @scroll-timeline

    在 CSS 规范 Scroll-linked Animations 中,推出了一个划时代的 CSS 功能.也就是 -- The @scroll-timeline at-rule,直译过来就是滚动时间线 ...

  4. 百度敏感词过滤(tp)

    百度智能云网址https://cloud.baidu.com/ 1:打开网址->管理控制台->产品服务->SDK下载>内容审核->phpSDK 2:下载至php目录ser ...

  5. Linux移植总结--Linux中asm和arch的软链接

    @ 目录 问题 include <asm/aaa.h>实际用的是asm-arm/aaa.h include <asm/arch/memory.h>实际用的是include/as ...

  6. Redis的Unable to connect to Redis和java.io.IOException: 远程主机强迫关闭了一个现有的连接问题的解决

      学习项目xhr系统用到springboot + vue(https://github.com/lenve/vhr),文档中要求使用到RabbitMQ,但是从我搭建开发环境来看,是否配置Rabbit ...

  7. 仿真pda,部署时出现问题

    为什么部署到基于 Windows Mobile 的 Pocket PC 设备或模拟器会因共享冲突错误而失败 自己遇到了网上找到的解决方案http://hi.baidu.com/yeflower/blo ...

  8. sem信号量与死锁的边缘

    1. 演示一个例子,出现死锁,用strace debug得到 #include<stdio.h> #include<pthread.h> #include<stdlib. ...

  9. Java9的模块化是什么

    Java9新特性中的模块化到底是什么 Java9中的一个重大特性是增加了一种新型的程序设计组件 - 模块. 官方对模块的定义为:一个被命名的,代码和数据的自描述集合.( the module, whi ...

  10. 保姆教程系列一、Linux搭建Nacos

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件.用来取代以前常用的注册中心(zookeeper ...