简介
模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。
使用sys模块
#!/usr/bin/python
#Filename:using_sys.py
import sys
print 'The command line anguments are :'
for i in sys.argv:
print i
print '\n\nThePythonPath is',sys.path,'\n'
运行结果
[root@fengniu020 test]# python using_sys.py we are argum ents
The command line anguments are :
using_sys.py
we
are
argum
ents
ThePythonPath is ['/hotdata/kehu/fotest_niufeecms/test', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info']
解释:
当我们执行python using_sys.py we are arguments的时候,我们使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序。Python为我们把它存储在sys.argv变量中。记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,’using_sys.py’是sys.argv[0]、’we’是sys.argv[1]、’are’是sys.argv[2]以及’argum ents’是sys.argv[3]。注意,Python从0开始计数,而非从1开始。
模块的nam e
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用
——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的nam e属性完成。
#!/usr/bin/python
#Filename:using_name.py
if __name__ =='__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
运行结果:
[root@fengniu020 test]# python using_name.py
This program is being run by itself
[root@fengniu020 test]# vim using_name.py
[root@fengniu020 test]# vim using_name.py
[root@fengniu020 test]# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import using_name
I am being imported from another module
>>>
每个Python模块都有它的nam e,如果它是’m ain‘,这说明这个模块被用户单独运行,
我们可以进行相应的恰当操作。
制造你自己的模块
如何创建你自己的模块
#!/usr/bin/python
#Filename:mymodule.py
def sayhi():
print 'Hi,this is my module speaking'
version = '0.1'
上面是一个 模块 的例子。你已经看到,它与我们普通的Python程序相比并没有什么特别之
处。我们接下来将看看如何在我们别的Python程序中使用这个模块。
记住这个模块应该被放置在我们输入它的程序的同一个目录中,或者在sys.path所列目录之
一。
#!/usr/bin/python
#Filename:mymodule_demo.py
import mymodule
mymodule.sayhi()
print 'version',mymodule.version
输出
[root@fengniu020 test]# python mymodule_demo.py
Hi,this is my module speaking
version 0.1
from ..import语句
如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用
from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from ..im port而使用im port语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。
#!/usr/bin/python
#Filename:mymodule_demo2.py
from mymodule import sayhi,version
sayhi()
print 'version',version
运行:
[root@fengniu020 test]# python mymodule_demo2.py
Hi,this is my module speaking
version 0.1
dir()函数
你可以使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。
当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。
[root@fengniu020 test]# python
Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
>>> sys.version
'2.6.6 (r266:84292, Jan 22 2014, 09:42:36) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]'
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']
>>>
>>> a=5#create a new variable 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']
>>> del a #delete a name
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']
>>>
它如何工作
首先,我们来看一下在输入的sys模块上使用dir。我们看到它包含一个庞大的属性列表。
接下来,我们不给dir函数传递参数而使用它——默认地,它返回当前模块的属性列表。注
意,输入的模块同样是列表的一部分。
为了观察dir的作用,我们定义一个新的变量a并且给它赋一个值,然后检验dir,我们观察到在列表中增加了以上相同的值。我们使用del语句删除当前模块中的变量/属性,这个变化再一次反映在dir的输出中。关于del的一点注释——这个语句在运行后被用来 删除 一个变量/名称。在这个例子中,del a,你将无法再使用变量a——它就好像从来没有存在过一样。
概括
模块的用处在于它能为你在别的程序中重用它提供的服务和功能。Python附带的标准库就是这样一组模块的例子