zoukankan      html  css  js  c++  java
  • 从终端运行python程序 模块内变量的作用域、添加模块的搜索路径

    终端窗口运行.py程序 

      首先你要安装python,命令行输入 python 有python提示符 >>> 出现说明安装成功

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    ' a test module '
    
    __author__ = 'Michael Liao'
    
    import sys
    
    def test():
        args = sys.argv
        if len(args)==1:
            print('Hello, world!')
        elif len(args)==2:
            print('Hello, %s!' % args[1])
        else:
            print('Too many arguments!')
    
    if __name__=='__main__':
        test()
    

      

      第1行和第二行是标准注释,第一行可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第二行可以表示该.py文件使用的标准UTF-8编码;

      第四行是一个字符串,表示模块的文档注释,任何模块的第一个字符串都默认为文档的注释

      以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。

    补充

      1)导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称

      2)当我们在命令行运行hello模块文件时,Python解释器把该模块内的一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

      

    输入命令格式

      这里的地址是完整的地址,

    python D:desktopforTest.py #文件的完整目录

      结果:

    命令行里的 python shell  环境

      打开cmd后直接输入 python 会进入 python 的 shell 环境,这里可以可以输入命令,还有就是 shell 里会有提示符 >>> 

      如 print('I love you')   

      运行结果:

     

       使用 exit() 退出 python 的 shell 环境

      

      File "<stdin>", line 1 错误:

      在shell 里面输入 python +程序名字 ,会出现这个错误,应该在终端下运行(见上)

    模块内的作用域

      参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017455068170048

      这个模块内的作用域和变量的作用域有些区别,前者区分的是不同模块内的变量名,即该模块被导入后模块内的变量是否能被新模块引用。(但是通过增加下划线确实能将public变量变为private变量,在一个模块中的变量也能受到影响,参见面向对象编程

      在模块中,我们可能会定义很多函数和变量,有的函数和变量我们希望给别人使用,但是有的变量和函数我们不希望被别人使用。在python中,是通过_前缀来实现的。

      正常的函数和变量名是公开的(public),可以被直接引用,比如:abcx123PI等;

      类似__xxx__这样的变量是特殊变量,可以被直接引用(但是不可以自己创建),但是有特殊用途,比如上面的__author____name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;

      类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc__abc等;

      之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。

    #被导入的模块forTest2.py代码
    #__arbitrarily__=='不能任意命名的特殊变量'#不能这样,会报错
    arbitrarily='能被直接引用的变量'
    _arbitrarily='非公开,不应该被直接引用,但是能'
    __arbitrarily='非公开,不应该被直接引用,但是能,和上面的一样'
    
    #作为测试的模块,其中导入了forTest2.py
    
    import forTest2
    print(forTest2.arbitrarily)
    print(forTest2._arbitrarily)
    print(forTest2.__arbitrarily)
    print(forTest2.__name__)
    
    #输出
    能被直接引用的变量
    非公开,不应该被直接引用,但是能
    非公开,不应该被直接引用,但是能,和上面的一样
    forTest2
    

      private函数或者变量不应该被别人引用,那么可以用来干什么呢,可以用来做代码封装和抽象,如:

    def _private_1(name):
        return 'Hello, %s' % name
    
    def _private_2(name):
        return 'Hi, %s' % name
    
    def greeting(name):
        if len(name) > 3:
            return _private_1(name)
        else:
            return _private_2(name)
    

      在模块里公开greeting函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:外部不需要引用的函数全定义为private,只有外部需要引用的函数才定义为public

       数据封装、继承和多态是面向对象编程的三大特点

    模块的搜索路径

      当我们试图导入一个模块时,python会在指定的路径下搜索对应的.py文件,如果找不到就会报错

    >>> import mymodule
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: No module named mymodule
    

      

      默认情况下,python会搜索当前目录,所有已安装的内置模块和第三方模块,搜索路径存放在sys的path变量当中

    >>> import sys
    >>> sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
    

      有两种办法可以添加自己的搜索目录

      一是直接修改sys.path,添加要搜索的目录

    >>> import sys
    >>> sys.path.append('/Users/michael/my_py_scripts')
    

      这种方法是在运行时修改,运行结束后失效

      第二种方法时修改环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中,设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响

      

       

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10484211.html
Copyright © 2011-2022 走看看