在所编写的别的程序中重用一些函数的话,应该使用模块(Modules)。编写模块有很多种方法,其中最简单的一种便是创建一个包含函数与变量、以.py 为后缀的文件。另一种方法是使用撰写Python 解释器本身的本地语言来编写模块。

 

import sys
print('The command line arguments are:')
for i in sys.argv:
    print(i)
print('\n\nThe PYTHONPATH is', sys.path, '\n')
$ python module_using_sys.py we are arguments
The command line arguments are:
module_using_sys.py
we
are
arguments

The PYTHONPATH is ['/tmp/py',
# many entries here, not shown here
'/Library/Python/2.7/site-packages',
'/usr/local/lib/python2.7/site-packages']

        通过 import 语句导入sys 模块。sys模块中的 argv 变量通过使用点号予以指明,也就是 sys.argv这样的形式,表明这一名称是 sys模块的一部分。当我们运行 python module_using_sys.py we are arguments 时,我们通过python 命令来运行 module_using_sys.py 模块,后面的内容则是传递给程序的参数。Python 将命令行参数存储在 sys.argv 变量中供我们使用。

       在这里要记住的是,运行的脚本名称在sys.argv的列表中总会位列第一。因此,在这一案例中我们将会有如下对应关系:'module_using_sys.py'对应sys.argv[0] ,'we' 对应sys.argv[1],'are' 对应sys.argv[2] ,'arguments'对应sys.argv[3] 。sys.path 内包括了包含导入模块的字典名称列表。观察到sys.path 的第一段字符串是空的——这一空字符串代表当前目录也是sys.path的一部分,它与PYTHONPATH环境变量等同。这意味着你可以直接导入位于当前目录的模块。否则,你必须将你的模块放置在sys.path内所列出的目录中。另外要注意的是当前目录指的是程序启动的目录。你可以通过运行 import os;
print(os.getcwd()) 来查看你的程序目前所处在的目录。

        如果希望直接将argv变量导入你的程序(为了避免每次都要输入sys. ),那么你可以通过使用 from sys import argv 语句来实现这一点。 

 

1. 模块的__name__ 

        由于主程序代码无论模块是被导入还是直接被执行都会运行,所以我们需要一种方式在运行时检测该模块是被导入还是被直接执行。该方式也就是__name__系统变量。如果模块是被导入,__name__的值为模块名字;如果是被直接执行,__name__的值为"__main__"。

if __name__ == '__main__':
    print('This program is being run by itself')
else:
    print('I am being imported from another module')
$ python module_using_name.py
This program is being run by itself
$ python
>>> import module_using_name
I am being imported from another module
>>>

2. dir函数 

 

        内置的 dir()函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列表会包括函数内所定义的函数、类与变量。该函数接受参数。 如果参数是模块名称,函数将返回这一指定模块的名称列表。 如果没有提供参数,函数将返回当前模块的名称列表。

$ python
>>> import sys
# 给出 sys 模块中的属性名称
>>> dir(sys)
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# only few entries shown here
# 给出当前模块的属性名称
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__']
# 创建一个新的变量 'a'
>>> a = 5
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a']
# 删除或移除一个名称
>>> del a
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']

vars()函数也可以返回给你这些值的属性,但只是可能,它并不能针对所有类都能正常工作。 

 

3. 包

        包是指一个包含模块与一个特殊的 __init__.py 文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了Python 模块。

       假设你想创建一个名为“world”的包,其中还包含着”asia“、”africa“等其它子包,同时这些子包都包含了诸如”india“、”madagascar“等模块。

- <some folder present in the sys.path>/
     - world/
         - __init__.py
         - asia/
             - __init__.py
             - india/
                 - __init__.py
                 - foo.py
         - africa/
         - __init__.py
         - madagascar/
             - __init__.py
             - bar.py