python之CWD與命令列引數

2021-09-29 16:08:21 字數 3609 閱讀 3853

這些工具可以用作輸入指令碼,配置引數等。

在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 方...