2012-12-10 129 views
3

我有python代碼,它將下載.war文件並將其放入由變量path指定的路徑中。如何將特定的戰爭文件提取到特定的文件夾

現在我希望從該戰爭中提取特定文件到特定文件夾。

但還是被擊中了這裏:

os.system(jar -xvf /*how to give the path varible here*/ js/pay.js) 

我不知道如何傳遞變量pathos.system命令。

我對python很陌生,請幫助我。

回答

5

如果你真的想用os.system ,shell命令行作爲字符串傳遞,並且您可以傳遞任何您想要的字符串。所以:

os.system('jar -xvf "' + pathvariable + '" js/pay.js) 

或者你可以使用{}%s格式化等

然而,你可能不希望使用os.system

首先,如果你想運行其他程序,幾乎總是使用subprocess模塊更好。例如:

subprocess.check_call(['jar', '-xvf', pathvariable, 'js/pay.js']) 

正如你所看到的,你可以傳遞的參數,而不是試圖找出如何把一個串起來的列表(和處理逃逸,報價和所有那些亂七八糟)。還有很多其他的優點,主要在文檔本身中描述。

但是,您可能根本不想運行war工具。正如jimhark所說,WAR file只是一種特殊的JAR file,它只是一種特殊的ZIP file。爲了創建它們,通常需要使用特定於JAR/WAR的工具(您需要驗證佈局,確保清單是ZIP目錄中的第一個條目,處理包簽名等),但是爲了擴展他們,任何ZIP工具都可以工作。而Python有內置的ZIP支持你想要做什麼可能是如此簡單:

import zipfile 
with zipfile.ZipFile(pathvariable, 'r') as zf: 
    zf.extract('js/pay.js', destinationpathvariable) 

IIRC,你只能直接在2.7和3.2以上版本使用ZipFilewith聲明,所以如果你是例如2.6或3。1,你要做到這一點間接:

from contextlib import closing 
import zipfile 
with closing(zipfile.ZipFile(pathvariable, 'r')) as zf: 
    zf.extract('js/pay.js', destinationpathvariable) 

或者,如果這僅僅是一個快速&骯髒的腳本,一旦它完成退出,你可以逃脫:

import zipfile 
zf = zipfile.ZipFile(pathvariable, 'r') 
zf.extract('js/pay.js', destinationpathvariable) 

但我儘量使用with聲明,因爲這是一個很好的習慣。

+0

我收到一個錯誤,因爲'NameError:name'ZipFile'未定義' – sriram

+1

'import zipfile' first first。然後'zipfile.ZipFile(pathvariable,'r')...'。它可能取決於你的python版本,但只是閱讀文檔,你會看到。 –

+0

謝謝你的作品! – sriram

3

是不是war文件zip文件類型? Python支持zipfile(單擊文檔頁面的鏈接)。

0

你可以使用os.environ,它包含所有的環境變量。 這是一個字典,所以你可以使用它像:

pypath = os.environ['PYTHONPATH'] 

現在,如果你的意思是這是一個常見的蟒蛇變量,只是用它喜歡:

var1 = 'pause' 
os.system('@echo & %s' % var1) 
相關問題