如何将特定war文件提取到特定文件夹

sri*_*ram 3 python jar

我有python代码,它将下载.war文件并将其放在由变量指定的路径中path.

现在我希望将该战争中的特定文件提取到特定文件夹.

但是我在这里受到了打击:

os.system(jar -xvf /*how to give the path varible here*/  js/pay.js)
Run Code Online (Sandbox Code Playgroud)

我不知道如何将变量传递pathos.system命令.

我是python的新手,请帮助我.

aba*_*ert 5

如果您真的想要使用os.system,shell命令行将作为字符串传递,您可以传递任何所需的字符串.所以:

os.system('jar -xvf "' + pathvariable + '" js/pay.js)
Run Code Online (Sandbox Code Playgroud)

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

但是,您可能不想使用os.system.

首先,如果你想运行其他程序,使用该subprocess模块几乎总是更好.例如:

subprocess.check_call(['jar', '-xvf', pathvariable, 'js/pay.js'])
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您可以传递一个参数列表,而不是试图找出如何将字符串放在一起(并处理转义和引用以及所有混乱).还有许多其他优点,主要在文档本身中描述.

但是,您可能根本不想运行该war工具.正如jimhark所说,WAR文件只是一种特殊的JAR文件,它只是一种特殊的ZIP文件.要创建它们,通常需要使用特定于JAR/WAR的工具(需要验证布局,确保清单是ZIP目录中的第一个条目,处理包签名等),但是要扩展他们,任何ZIP工具都可以.Python内置了ZIP支持.你想要做的事情可能就像这样简单:

import zipfile
with zipfile.ZipFile(pathvariable, 'r') as zf:
    zf.extract('js/pay.js', destinationpathvariable)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

或者,如果这只是一个快速而肮脏的脚本,一旦完成就会退出,您可以逃脱:

import zipfile
zf = zipfile.ZipFile(pathvariable, 'r')
zf.extract('js/pay.js', destinationpathvariable)
Run Code Online (Sandbox Code Playgroud)

但我尽量使用with语句,因为这是一个很好的习惯.