如何在linux下通过import来导入自定义的模块
- 1.首先运行python,输入以下命令来获取系统中Python的默认路径:
import sys
sys.path
-
比如,其中一个路径是:/usr/local/python/lib/python2.7/site-packages/
这时可以把自己编写的工程放入到该目录下。比如我编写了一个基于知网来计算词语相似度的程序,所有的模块都放在
包wordSimilarity中。
/usr/local/python/lib/python2.7/site-packages/wordSimilarity/
-
_init_.py
primitive.py
word.py
wordsimilarity.py
WHOLE.DAT
glossary.dat
…
注意,文件夹中wordSimilarity必须包含_ init _.py文件,这时候才是python包,否则知识一般的文件夹,是不可以import导入的。
- 2.在/usr/local/python/lib/python2.7/site-packages/目录下建立**(随便名字).pth文件,在该文件中输入wordSimilarity包的绝对路径,/usr/local/python/lib/python2.7/site-packages/wordSimilarity/,保存。
- 3.此时,就可以Import我们自定义的模块了。
import wordSimilarity as ws
from wordSimilarity import wordsimilarity
...
关于os.path的使用
在上面提到的利用知网来计算词语相似度的程序,因为需要从文件(即上面的WHOLE.DAT和glossary.dat或者.txt文件)中读入词条,所以需要把包含词条的文件随模块放在一起才能被正确调用。之前都是用全路径来调用,是在太愚蠢了。
先上代码(获取glossary.dat文件):
"""这方法是看了jieba分词的源码才知道的,非常感谢~~"""
_get_module_path = lambda path: os.path.normpath(os.path.join(
os.path.dirname(__file__), path))
path = _get_module_path("glossary.dat")
结巴分词的源码是这样的:
_get_module_path = lambda path: os.path.normpath(os.path.join(os.getcwd(),
os.path.dirname(__file__), path))
DEFAULT_IDF = _get_module_path("idf.txt")
但是我的理解是:这个os.getcwd()似乎是多余的,因为os.getcwd()获取的是当前执行命令的所在路径,假设当前路径不是在/usr/local/python/lib/python2.7/site-packages/wordSimilarity/,都是没用的。
下面介绍一下os.path的常用方法来解释一下为什么:
import os
# 获取目前运行程序所在的绝对路径
os.path.getcwd()
# 返回路径名path的规范化的绝对路径。在大多数平台,这等同于这样
# normpath(join(os.getcwd(), path))调用normpath()函数
os.parh.abspath(path)
# 返回路径名为path的目录名
os.path.dirname(path)
os.path.dirname(__file__) # __file__返回所调用的模块的绝对路径
# 将一个或多个路径正确地连接起来。如果任何一个参数是绝对路径,那之前的参数就会被丢弃,然后连接继续
os.path.join(path1[, path2[, ...]])
最主要的是:print os.path.dirname(_file_)
一般来说,.py文件中所要读写的文件,最好是和.py文件放在同一个层中,这样会更加方便。
后记
词语相似度的代码基本完成了,但是还需要继续优化。调用方式如下:
import wordsimilarity as ws
word1 = "打架"
word2 = "战斗"
# 计算两个词语的相似度
sim = ws.simWordStr(word1, word2)
...