從終端運行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:\desktop\forTest.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自己本身的搜索路徑不受影響

 

  

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM