這些工具可以用作輸入指令碼,配置引數等。
在shell命令列中python dir1\dir2\file.py執行該指令碼時,cwd是你鍵入該命令時所處的路徑,而非dir1\dir2。另一方面python自動
將指令碼所在目錄新增到模組搜尋路徑的最前面。因而無論從**執行,file.py總是可以匯入dir1\dir2中的其他檔案。
c:…\mybook_python_programming\test_3\whereami.py
import os, sys
print('my os.getcwd =>', os.getcwd()) # 輸出cwd執行目錄
print('my sys.path =>', sys.path[:1]) # 輸出第乙個匯入路徑
cwd會如預期列印出當前工作路徑,同時該路徑將會被載入到模組搜尋器的最前端
my os.getcwd => c:\...\mybook_python_programming\test_3
my sys.path => ['c:\\...\\mybook_python_programming\\test_3']
但是如果我們在別的路徑下執行該指令碼,cwd會隨之改變(及我們輸入命令的路徑),並且python會把所在路徑新增到模組搜尋路徑的最前面
從而使得指令碼能看到它所在的所有檔案。比如當從上一級目錄(…)執行時,新增與sys.path最前面的system將會是whereami.py搜尋匯入
模組的第乙個目錄,從而將匯入指回指令碼所在目錄。當沒有提供完整路徑的檔名時,將會被對映到cwd而不是system目錄
(environment) c:\..\mybook_python_programming>cd test_1
(environment) c:\..\mybook_python_programming\test_1>python ..\test_3\whereami.py
my os.getcwd => c:\..\mybook_python_programming\test_1
my sys.path => ['c:\\..\\mybook_python_programming\\test_3']
避免以下兩個陷阱
cwd和匯入搜尋路徑的區別
c:\temp> pyhton c:\...\pp4e\tools\cleanpyc.py process cwd
雖然指令碼在tools中,但他在c:\temp上啟動,所以它將處理c:\temp中的檔案(cwd,非檔案所在目錄)。要使指令碼處理別的檔案可以簡單的cd到
所要處理的檔案目錄來改變cwd
c:\temp> cd c:\pp4thed\examples
c:\pp4thed\examples> python c:\...\pp4e\tools\cleanpyc.py process cwd
由於cwd通常是隱含的,與在python指令碼後傳遞引數的方式相比,cd命令更加清晰,可以指定指令碼處理那個目錄
c:\...\pp4e\tools> python find.py "*.py" c:\temp process name dir
以temp為cwd,呼叫tools中的find.py檔案處理examples中的.cxx檔案,命令與cwd無關
##命令列引數
pyhton可以通過sys模組獲取指令碼啟動時命令列輸入的資訊,通常他們被稱為命令列引數,以內建字串列表的形式存於sys.ar**中,與c的ar**陣列很類似
互動命令列方式啟動的python沒有命令列引數被傳入,所以ar**是空串。
>>> import sys
>>> sys.ar**
['']
想要看到引數,我們得從shell命令列啟動指令碼。
檔案:c:/…/mybook_python_programming/test_3/testar**.py
import sys
print(sys.ar**)
該指令碼將列印出命令列引數列表,無論以什麼方式啟動,列表的第一項均為所執行指令碼的名字。
(environment) c:\...\mybook_python_programming>cd test_3
(environment) c:\...\mybook_python_programming\test_3>python testar**.py
['testar**.py']
(environment) c:\...\mybook_python_programming\test_3>python testar**.py spam eggs chees
['testar**.py', 'spam', 'eggs', 'chees']
(environment) c:\...\mybook_python_programming\test_3>python testar**.py -i data.txt -o results.text
['testar**.py', '-i', 'data.txt', '-o', 'results.text']
上述最後乙個命令為一種慣例,類似於function引數,,命令列引數通過位置或使用「-name value」詞語組來傳遞。
如同函式引數的作用,命令列引數扮演著同樣重要的角色,它們都為程式傳遞可變資訊。由於不需要硬編碼,它們使指令碼更通用。
一旦使用命令列引數, 你會發現直接操作引數列表是不容易的。程式在啟動的時候會將它們轉換為更易用的結構。如下示例的指令碼是掃瞄ar**列表
查詢 -optionname optionvalue值對,並以optionname為鍵值儲存到字典結構中方便使用。
檔案:c:/…/mybook_python_programming/test_3/testar**2.py
"collect command-line options in a dictionary"
# 根據傳入的命令列引數,返回乙個名行引數鍵值對的字典
def getopts(ar**):
opts = {}
# 直到列表為空
while ar**:
# 如果列表的第乙個元素的第乙個符號為'-',說明這是乙個鍵
if(ar**[0][0] == '-'):
# 將第乙個元素設定為鍵,將緊跟的第二個元素設為該鍵的值
opts[ar**[0]] = ar**[1]
# 更新引數列表將前兩個元素切掉
ar** = ar**[2:]
# 如果不是乙個鍵,直接將該元素切掉
else:
ar**=ar**[1:]
return opts
if __name__ == '__main__':
from sys import ar**
myargs = getopts(ar**)
if '-i' in myargs:
print(myargs['-i'])
print(myargs)
python 命令列傳參
1.簡單的寫法 通過匯入模組sys import sys if name main argc len sys.ar arg0 sys.ar 0 2.稍微複雜一點的引數可以使用getopt模組 import sys import getopt if name main opt,args getopt....
python argparse 模組命令列引數解析
argparse 是 python 的乙個命令列解析包,可根據需要編寫高可讀性的程式。網上的許多教程較為冗長和散漫,沒有達到精練好掌握的目的,本文針對專案中對 argparse 的用法,用例項對各個引數進行講解,力求達到讓讀者秒懂的目的。先上 import argparse if name main...
方法 命令列傳參
設計方法的原則 方法的本意是功能塊,就是實現某個功能的語句塊的集合。我們設計方法的時候,最好保持方法的原子性,就是乙個方法只完成1個功能,這樣有利於我們後期的擴充套件 例 package 包 public class ww 加法 public static int add int a,int b 方...