從終端運行python程序 模塊內變量的做用域、添加模塊的搜索路徑

終端窗口運行.py程序 

  首先你要安裝python,命令行輸入 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編碼;shell

  第四行是一個字符串,表示模塊的文檔註釋,任何模塊的第一個字符串都默認爲文檔的註釋編程

  以上就是Python模塊的標準文件模板,固然也能夠所有刪掉不寫,可是,按標準辦事確定沒錯。app

 

補充

  1)導入sys模塊後,咱們就有了變量sys指向該模塊,利用sys這個變量,就能夠訪問sys模塊的全部功能。sys模塊有一個argv變量,用list存儲了命令行的全部參數。argv至少有一個元素,由於第一個參數永遠是該.py文件的名稱函數

  2)當咱們在命令行運行hello模塊文件時,Python解釋器把該模塊內的一個特殊變量__name__置爲__main__,而若是在其餘地方導入該hello模塊時,if判斷將失敗,所以,這種if測試可讓一個模塊經過命令行運行時執行一些額外的代碼,最多見的就是運行測試。測試

  

 

 

輸入命令格式

  這裏的地址是完整的地址,編碼

python D:\desktop\forTest.py #文件的完整目錄

  結果:spa

 

 

 

 

命令行裏的 python shell  環境

  打開cmd後直接輸入 python 會進入 python 的 shell 環境,這裏能夠能夠輸入命令,還有就是 shell 裏會有提示符 >>> 命令行

  如 print('I love you')   3d

  運行結果:

 

 

   使用 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本身自己的搜索路徑不受影響

相關文章
相關標籤/搜索